自offline_access弃用以来如何扩展访问令牌的有效性

Rok*_*nko 60 php facebook-graph-api oauth-2.0 facebook-oauth facebook-php-sdk

由于offline_access 权限是在Facebook的弃用认证流程,我们有问题歌厅所谓的长期生活的访问令牌没有这个权限.

Facebook的文档中有关的弃用说,服务器端OAuth生成的访问令牌将是长期存在的,但事实并非如此.

我错过了什么吗?应用设置中的一些设置?我需要使用一些特殊代码来延长访问令牌的到期时间?据我所知,对于服务器端身份验证,getAccessToken()当用户登录时,可以通过PHP SDK 的方法访问访问令牌.

Mar*_*iet 72

编辑(2012年8月14日):
一周前官方的Facebook PHP SDK更新了.函数名称已更改为setExtendedAccessToken,并且确定我们实际上需要在之后销毁会话,以消除有两个活动会话的风险.
此外,该函数不再实际返回令牌,而是将其存储在持久数据中.因此,您可以在之后使用公共函数getAccessToken获取新的访问令牌.从官方Facebook PHP SDK github页面获取新的SDK,以确保您是最新的.

原答案:

我在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'];
}
Run Code Online (Sandbox Code Playgroud)


Jui*_*ter 22

实际上是说了什么:

如果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
Run Code Online (Sandbox Code Playgroud)

由于多种原因,此令牌仍然可能无效,以及如何处理如何处理过期访问令牌博客帖子中描述的内容.

更新:
2012年8月7日起,您可以使用setExtendedAccessToken方法来扩展,access_token而不是手动构建URL和检索详细信息.


小智 10

//使用javascript弹出登录facebook

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;
Run Code Online (Sandbox Code Playgroud)

//在1-2小时到期时获得了accessstoken

//将accessstoken放入名为facebook controller的控制器中

        $request = $this->getRequest();
        $params = $request->getParams();
        $token=$params['accessToken'];
Run Code Online (Sandbox Code Playgroud)

//将访问令牌延长至60天

        $conf = $this->getConfigs();
        $appid = $conf['fbdetails']['appid'];
        $secret = $conf['fbdetails']['secret'];
        $baseurl = $conf['app']['baseurl'];
Run Code Online (Sandbox Code Playgroud)

//在执行下面的代码之后,我们将得到一个响应,其中一个令牌到期时间为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;
Run Code Online (Sandbox Code Playgroud)

//上面的响应用于解析.

        $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);
Run Code Online (Sandbox Code Playgroud)

//在解析上述执行代码中的内容之后,存储新的扩展的accessstoken.

        $user_session = new Zend_Session_Namespace('fbuser');
        $user_session->access_token = $paramsfb['access_token'];
Run Code Online (Sandbox Code Playgroud)

//存储到会话.

        $this->_redirect('/home');
Run Code Online (Sandbox Code Playgroud)

//有一个很好的编码