Facebook 已删除 offline_access 令牌功能,现在令牌必须在用户访问您的网站时更新以保持其活跃。
假设某人已经授予了您的网站访问权限,并且您为他们存储了一个令牌。你会用什么代码和 Facebook 的 PHP 库来更新这个令牌?
您可以通过以下方式扩展您的令牌:
原始场景
现在,您拥有该令牌,可以在 60 天内随心所欲地使用它。最多,因为用户可以更改密码,取消授权应用程序等,令牌将失效。扩展令牌可以做的是每次用户访问您的页面,您可以检查他们是否通过 javascript 登录,如果是,则对您的服务器进行 ajax 调用以将现有令牌延长 60 天今天。您可以拨打任意数量的电话,只有第一个有效。这是我的做法:
在加载事件期间的某个页面上,添加如下内容:
FB.getLoginStatus(function (response) {
if (response.status === 'connected') {
$.ajax({
type: "POST",
async: false,
url: YOUR_URL,
dataType: "text",
data: {token : response.authResponse.accessToken }
});
}
});
//rest of jquery ajax call here
这将为用户获取一个新的客户端访问令牌并将其发送到服务器
然后,服务器可以获取该令牌并将其交换为 60 天
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".FACEBOOK_CLIENT_ID."&client_secret=".FACEBOOK_SECRET."&grant_type=fb_exchange_token&fb_exchange_token=".$token;
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_URL, $token_url);
$contents = curl_exec($c);
$err = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);
$paramsfb = null;
parse_str($contents, $paramsfb);
参考:
https://developers.facebook.com/roadmap/offline-access-removal/
如果用户在 60 天内回到您的网站,那只会延长令牌。如果没有,您将需要再次提示权限。
更新
是的@zerkms 是对的,如果应用程序有权限,则不需要 access_token。
With this permission, you can publish content to a user's feed at any time. However, please note that Facebook recommends a user-initiated sharing model. Please read the Platform Policies to ensure you understand how to properly use this permission. Note, you do not need to request the publish_stream permission in order to use the Feed Dialog, the Requests Dialog or the Send Dialog.
所有扩展权限都有类似的权限:https ://developers.facebook.com/docs/authentication/permissions/
这是我目前正在做的事情
public function setExtendAccessToken($accessToken = NULL) {
enter code here
if(!$accessToken) return;
$graphUrl = 'https://graph.facebook.com/oauth/access_token?client_id='.$facebookAppId.
'&client_secret='.$facebookSecret.
'&grant_type=fb_exchange_token&fb_exchange_token='.$accessToken;
$accessToken = @file_get_contents($graphUrl);
parse_str($accessToken); //get the access_token param in the string and would be named $access_token
if(!$access_token) $access_token = $accessToken; //if cannot be extended then just return the access token with 2 hours expiry
return $access_token;
}
use Facebook\FacebookSession;
use Facebook\GraphSessionInfo;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookRedirectLoginHelper;
FacebookSession::setDefaultApplication('YOURAPPID', 'SECRET');
$user_accessToken = $_COOKIE['access_token_facebook']
$session = new FacebookSession($user_accessToken);
try {
$session->validate();
} catch (FacebookRequestException $ex) {
// When Facebook returns an error
echo $ex->getMessage();
} catch (\Exception $ex) {
// When validation fails or other local issues
echo $ex->getMessage();
}
if ($session) {
// Exchange token for long token
$longToken = $session->getExchangeToken();
// ... your other stuff
}
参考: https ://developers.facebook.com/docs/facebook-login/access-tokens#pagetokens https://developers.facebook.com/docs/facebook-login/access-tokens#extending