Facebook的PHP SDK v5 getAccessToken()函数如何工作

问题描述:

我有一个项目,我正在努力在哪里我想使用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

您无需对登录重定向网址中的代码参数执行任何操作。

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一个电话,结果存储在一个变量。任何使用相同代码的后续调用都将被视为是跨站请求伪造,并且会引发异常。