Facebook PHP SDK v5 getAccessToken() 函数如何工作
How does the Facebook PHP SDK v5 getAccessToken() function work
我有一个正在开发的项目,我想使用 Facebook PHP SDK v5 将 post 数据发送到 Facebook 页面,但我无法制作 ajax 调用我的 Facebook 脚本。
这是我的 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
以及对 facebook.php
文件进行 ajax 调用的页面
<?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 网站上的文档,这就是 Facebook 所说的 getAccessToken()
工作方式
Attempts to obtain an access token from an authorization code. This method will make a request to the Graph API and return a response. If there was an error in that process a FacebookSDKException will be thrown. A FacebookSDKException will also be thrown if the CSRF validation fails.
我 运行 遇到的问题是当我的用户打开 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脚本,并从回调中获取代码参数。我的问题是如何将回调得到的code参数传给facebook.php
里面的getAccessToken()
函数?
getAccessToken()
似乎不接受代码参数。我想知道是否需要将代码参数设置为特定的会话变量以便 getAccessToken()
读取它。有谁知道如何使这项工作?
您无需对登录重定向中的代码参数执行任何操作 URL。
getAccessToken()
方法获取代码本身,使用 class 的 getCode()
方法从 URL 查询字符串中提取代码。因此,一旦您回到 my-callback-url.php
,您就可以调用该方法,它应该 return 访问令牌。
从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()
进行多次调用——进行一次调用并将结果存储在变量中。使用相同代码的任何后续调用都将被视为跨站点请求伪造,并将抛出异常。
我有一个正在开发的项目,我想使用 Facebook PHP SDK v5 将 post 数据发送到 Facebook 页面,但我无法制作 ajax 调用我的 Facebook 脚本。
这是我的 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
以及对 facebook.php
文件进行 ajax 调用的页面
<?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 网站上的文档,这就是 Facebook 所说的 getAccessToken()
工作方式
Attempts to obtain an access token from an authorization code. This method will make a request to the Graph API and return a response. If there was an error in that process a FacebookSDKException will be thrown. A FacebookSDKException will also be thrown if the CSRF validation fails.
我 运行 遇到的问题是当我的用户打开 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脚本,并从回调中获取代码参数。我的问题是如何将回调得到的code参数传给facebook.php
里面的getAccessToken()
函数?
getAccessToken()
似乎不接受代码参数。我想知道是否需要将代码参数设置为特定的会话变量以便 getAccessToken()
读取它。有谁知道如何使这项工作?
您无需对登录重定向中的代码参数执行任何操作 URL。
getAccessToken()
方法获取代码本身,使用 class 的 getCode()
方法从 URL 查询字符串中提取代码。因此,一旦您回到 my-callback-url.php
,您就可以调用该方法,它应该 return 访问令牌。
从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()
进行多次调用——进行一次调用并将结果存储在变量中。使用相同代码的任何后续调用都将被视为跨站点请求伪造,并将抛出异常。