首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展offline_access弃用后的访问令牌有效性

如何扩展offline_access弃用后的访问令牌有效性
EN

Stack Overflow用户
提问于 2012-01-24 12:30:04
回答 7查看 51.6K关注 0票数 60

由于offline_access Permission在Facebook的Authentication流中已被弃用,因此在没有该权限的情况下获取所谓的长寿访问令牌是有问题的。

Facebook's document about the deprecation中,它说服务器端OAuth生成的访问令牌将是长期存在的,但它们不是。

我是不是遗漏了什么?应用程序设置中的某些设置?我需要使用一些特殊的代码来延长访问令牌的过期时间?根据我对文档的理解,对于服务器端身份验证,当用户登录时,可以通过PHP SDK的getAccessToken()方法访问的访问令牌是长期存在的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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中并调用它即可。这对我很管用。

代码语言:javascript
复制
 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'];
}
票数 72
EN

Stack Overflow用户

发布于 2012-01-24 15:17:55

实际上是这样说的:

如果access_token是从服务器端OAuth调用生成的,则生成的access_token 将具有较长的过期时间。如果在仍然存在该用户的有效access_token的情况下进行调用,则从第二个调用返回的access_token将保持不变,并且只延长过期时间。同样,在同一天内多次调用此函数只会导致第一次调用延长过期时间。

这意味着它将比客户端生成的令牌更长,要接收延长的令牌(60天),您需要通过向以下位置发出请求来手动执行此操作:

代码语言:javascript
复制
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和检索详细信息。

票数 22
EN

Stack Overflow用户

发布于 2012-03-05 15:11:54

//使用javascript弹出facebook登录

代码语言:javascript
复制
FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

//获取过期时间为1-2小时的accesstoken

//获得了名为facebook controller的控制器的访问权

代码语言:javascript
复制
        $request = $this->getRequest();
        $params = $request->getParams();
        $token=$params['accessToken'];

//获取访问令牌,延长到60天

代码语言:javascript
复制
        $conf = $this->getConfigs();
        $appid = $conf['fbdetails']['appid'];
        $secret = $conf['fbdetails']['secret'];
        $baseurl = $conf['app']['baseurl'];

//执行下面的代码后,我们将得到一个响应,访问令牌过期时间为60天。

代码语言:javascript
复制
        $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$appid."&client_secret=".$secret."&grant_type=fb_exchange_token&fb_exchange_token=".$token;

//上面给出了解析的响应。

代码语言:javascript
复制
        $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。

代码语言:javascript
复制
        $user_session = new Zend_Session_Namespace('fbuser');
        $user_session->access_token = $paramsfb['access_token'];

//存储到会话中。

代码语言:javascript
复制
        $this->_redirect('/home');

//有一个很好的编码

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8982025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档