Android 来自Facebook的扩展访问令牌无法正常工作

Android 来自Facebook的扩展访问令牌无法正常工作,android,facebook,facebook-access-token,Android,Facebook,Facebook Access Token,我遇到了麻烦,因为Facebook已经删除了离线访问权限 尝试了两件事: 我是按照Facebook的建议打电话的 https://graph.facebook.com/oauth/access_token? client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCE

我遇到了麻烦,因为Facebook已经删除了离线访问权限

尝试了两件事:

  • 我是按照Facebook的建议打电话的

    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 
    
  • 我还尝试了Android SDK,它使用了一种获取扩展访问令牌的意图:

    intent.setClassName("com.facebook.katana", "com.facebook.katana.platform.TokenRefreshService");
    
  • 在developers.facebook.com,我将我的应用程序设置为“本机/桌面”

    我也在应用程序设置中禁用了
    脱机访问

    在尝试之前,我从我的Facebook帐户中删除了旧权限

    这两种方法都为我提供24小时代币。也许有人能帮我打个正确的电话,拿到60天的代币


    我看到了很多关于这个问题的bug报告,但也都已经解决了。我的情况似乎不是这样。

    您是否测试过令牌是否持续24小时以上?根据文档,在某些情况下,仅更新到期时间,而令牌保持不变:

    但是,返回的access_令牌将有一个新的长期过期时间, 访问令牌本身可能与先前授予的长期访问令牌相同,也可能不同


    假设您使用的是FacebookSDK,那么allready有一个内置的方法

    facebook.extendAccessTokenIfNeeded(this, null);
    
    这是上下文,null是serviceListener


    您也可以使用扩展访问令牌,相同的主体

    使用以下函数获取扩展访问令牌: 公共函数getExtendedAccessToken(){


    }

    也许你应该向Facebook的支持部门咨询一下。实际上,当前版本的Android SDK只会使用com.Facebook.katana服务;这意味着,如果用户尚未安装应用程序,则不会刷新令牌。
    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'),
                $params = array(    'client_id' => $this->getAppId(),
                                    'client_secret' => $this->getApiSecret(),
                                    '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'];