2017-08-03 70 views
1

我有一個項目,我正在努力在哪裏我想使用Facebook的PHP SDK v5發佈數據到Facebook頁面,但我有麻煩製作一個Ajax打電話給我的Facebook腳本。Facebook的PHP SDK v5 getAccessToken()函數如何工作

這是我的facebook.php文件:

<?php 
session_start(); 
echo facebook(); 

function facebook(){ 
    include_once $_SERVER['DOCUMENT_ROOT']."/Facebook/autoload.php"; 
    $permissions = ['manage_pages', 'publish_pages']; 
    $callback = "https://www.my-domain.com/my-callback-url.php?fb=redirect"; 

    $fb = new Facebook\Facebook([ 
     'app_id' => 'xxxxxxxxxxx', 
     'app_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
     'default_graph_version' => 'v2.10', 
     ]); 

    $helper = $fb->getRedirectLoginHelper(); 

    try { 
     if (isset($_SESSION['facebook_access_token'])) { 
      $accessToken = $_SESSION['facebook_access_token']; 
     } else { 
      $accessToken = $helper->getAccessToken(); 
     } 
    } catch(Facebook\Exceptions\FacebookResponseException $e) { 
     $res['error'] = 'Error: Graph returned a session error: ' . $e->getMessage(); 
     return json_encode($res); 
    } catch(Facebook\Exceptions\FacebookSDKException $e) { 
     $res['error'] = 'Error: Facebook SDK returned a session error: ' . $e->getMessage(); 
     return json_encode($res); 
    } 

    if (!isset($accessToken)) { 
     $redirectUrl = $helper->getLoginUrl($callback, $permissions); 
     $res['login'] = $redirectUrl; 
     return json_encode($res); 
    }else{ 
     // rest on the script to post to a page 
    } 
} 
?> 

這是my-callback-url.php以及頁面,使AJAX調用facebook.php文件

<?php 

if(isset($_GET['fb'])){ 
    $code = $_GET['code']; 
}else{ 
    $code = ''; 
} 

<script type="text/javascript"> 
jQuery(document).ready(function($) { 

var code = "<?php echo $code; ?>"; 

if(code !== ''){ 
    postToFB(code); 
} 

$('#postButton').on('click',function(){ 
    postToFB(code); 
} 

function postToFB(code){ 
    $.ajax({ 
     type: "POST", 
     url: 'facebook.php', 
     data: {"somePostData": "someValue", "redirectCode":code}, 
     success: function (data) { 
      var json = $.parseJSON(data); 
      if(json.hasOwnProperty('login')){ 
       window.location.replace(json.login); 
      } 
     } 
    }); 
} 

}); 
</script> 

?> 

據對Facebook的網站documentstion這是Facebook如何說getAccessToken()作品

嘗試從授權代碼獲取訪問令牌。此方法將向Graph API發出請求並返回響應。如果在該過程中出現錯誤,則會拋出FacebookSDKException。如果CSRF驗證失敗,也會拋出一個FacebookSDKException。

我遇到的問題是,當我的用戶是my-callback-url.php並點擊#postButton腳本,使一個AJAX調用facebook.php

如果facebook.php無法獲得訪問令牌調用:

$redirect = $helper->getLoginUrl($callback, $permissions); 

這將$redirect值發送回my-callback-url.php中的ajax函數,並且成功方法會將用戶發送到該重定向url。

一旦用戶進行身份驗證,Facebook的向用戶發送回my-callback-url.php完整的URL回調看起來是這樣的:

https://www.my-domain.com/my-callback-url.php&fb=redirect?code=xxxxxxxxxx?state=xxxxxxxxxx 

回調作出後,my-callback-url.php與所獲得的代碼參數一起再次運行AJAX腳本從回調。我的問題是我如何將從回調獲得的代碼參數傳遞給facebook.php中的getAccessToken()函數?

似乎getAccessToken()接受一個代碼參數。我想知道是否需要將代碼參數設置爲特定的會話變量,以便getAccessToken()可以讀取它。有誰知道如何使這項工作?

+1

_「在回調完成之後,my-callback-url.php再次運行ajax腳本以及從回調中獲得的代碼參數」_ - 那麼這對於......來說有什麼好處?你應該直接在你接收它的地方處理代碼參數 - 這就是你的'my-callback-url.php'腳本。在那裏直接獲取令牌 - 並且不涉及任何AJAX廢話。 – CBroe

回答

2

您無需對登錄重定向網址中的代碼參數執行任何操作。

getAccessToken()方法使用從URL查詢字符串中提取代碼的類的getCode()方法獲取代碼本身。所以,一旦你回到my-callback-url.php,你可以調用該方法,它應該返回訪問令牌。

這可以從方法本身看出,在SDK:

/** 
* Takes a valid code from a login redirect, and returns an AccessToken entity. 
* 
* @param string|null $redirectUrl The redirect URL. 
* 
* @return AccessToken|null 
* 
* @throws FacebookSDKException 
*/ 
public function getAccessToken($redirectUrl = null) 
{ 
    if (!$code = $this->getCode()) { 
     return null; 
    } 

    $this->validateCsrf(); 
    $this->resetCsrf(); 

    $redirectUrl = $redirectUrl ?: $this->urlDetectionHandler->getCurrentUrl(); 
    // At minimum we need to remove the state param 
    $redirectUrl = FacebookUrlManipulator::removeParamsFromUrl($redirectUrl, ['state']); 

    return $this->oAuth2Client->getAccessTokenFromCode($code, $redirectUrl); 
} 

只是一個提醒一句:不要多次調用getAccessToken() -make一個電話,結果存儲在一個變量。任何使用相同代碼的後續調用都將被視爲是跨站請求僞造,並且會引發異常。