由于offline_access Permission在Facebook的Authentication流中已被弃用,因此在没有该权限的情况下获取所谓的长寿访问令牌是有问题的。
在Facebook's document about the deprecation中,它说服务器端OAuth生成的访问令牌将是长期存在的,但它们不是。
我是不是遗漏了什么?应用程序设置中的某些设置?我需要使用一些特殊的代码来延长访问令牌的过期时间?根据我对文档的理解,对于服务器端身份验证,当用户登录时,可以通过PHP SDK的getAccessToken()方法访问的访问令牌是长期存在的。
发布于 2012-01-27 22:45:18
编辑(2012年8月14日):
一周前,Facebook官方PHP SDK进行了更新。函数名被更改为setExtendedAccessToken,并决定我们实际上需要在之后销毁会话,以消除有两个活动会话的风险。
此外,该函数不再实际返回令牌,而是将其存储在持久数据中。因此,您可以随后使用公共函数getAccessToken获取新的访问令牌。从official Facebook PHP SDK github page获取新的软件开发工具包,以确保您是最新的。
原始答案:
我向base_facebook.php文件添加了一个新的公共函数,该函数返回一个新的访问令牌,该令牌将在60天后过期。您可以在收到正常的访问令牌后向此函数发出请求。我还没有测试过,但我假设你也需要在开发者应用程序的高级设置中启用“弃用offline_access”。
只需将此代码添加到facebook类中的base_facebook.php中并调用它即可。这对我很管用。
public function getExtendedAccessToken(){
try {
// need to circumvent json_decode by calling _oauthRequest
// directly, since response isn't JSON format.
$access_token_response =
$this->_oauthRequest(
$this->getUrl('graph', '/oauth/access_token'), array(
'client_id' => $this->getAppId(),
'client_secret' => $this->getAppSecret(),
'grant_type'=>'fb_exchange_token',
'fb_exchange_token'=>$this->getAccessToken()
)
);
} catch (FacebookApiException $e) {
// most likely that user very recently revoked authorization.
// In any event, we don't have an access token, so say so.
return false;
}
if (empty($access_token_response)) {
return false;
}
$response_params = array();
parse_str($access_token_response, $response_params);
if (!isset($response_params['access_token'])) {
return false;
}
return $response_params['access_token'];
}发布于 2012-01-24 15:17:55
实际上是这样说的:
如果access_token是从服务器端OAuth调用生成的,则生成的access_token 将具有较长的过期时间。如果在仍然存在该用户的有效access_token的情况下进行调用,则从第二个调用返回的access_token将保持不变,并且只延长过期时间。同样,在同一天内多次调用此函数只会导致第一次调用延长过期时间。
这意味着它将比客户端生成的令牌更长,要接收延长的令牌(60天),您需要通过向以下位置发出请求来手动执行此操作:
https://graph.facebook.com/oauth/access_token?
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN这个令牌仍然可能因为几个原因而失效,以及如何处理How-To: Handle expired access tokens博客文章中描述的这个问题。
更新:
从Aug 07, 2012开始,您可以使用setExtendedAccessToken方法来扩展access_token,而不是手动构造URL和检索详细信息。
发布于 2012-03-05 15:11:54
//使用javascript弹出facebook登录
FB.login(function(response) {
if (response.authResponse) {
var accessToken = response.authResponse.accessToken;//获取过期时间为1-2小时的accesstoken
//获得了名为facebook controller的控制器的访问权
$request = $this->getRequest();
$params = $request->getParams();
$token=$params['accessToken'];//获取访问令牌,延长到60天
$conf = $this->getConfigs();
$appid = $conf['fbdetails']['appid'];
$secret = $conf['fbdetails']['secret'];
$baseurl = $conf['app']['baseurl'];//执行下面的代码后,我们将得到一个响应,访问令牌过期时间为60天。
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$appid."&client_secret=".$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);//解析上述执行代码中的内容后,存储新的扩展accesstoken。
$user_session = new Zend_Session_Namespace('fbuser');
$user_session->access_token = $paramsfb['access_token'];//存储到会话中。
$this->_redirect('/home');//有一个很好的编码
https://stackoverflow.com/questions/8982025
复制相似问题