3

我正在寻找一种方法来在我们的后端将短期访问令牌交换为长期访问令牌,如 Facebook此处所述。如何用 facebook4j 做到这一点?

4

2 回答 2

1

我做了这样的事情来将旧令牌换成新令牌:

private AccessToken refreshToken(Facebook facebook, AccessToken currentToken) throws Exception {
    String clientId = configuration.getString(ConfigurationKeys.SOCIAL_FACEBOOK_CLIENTID);
    String clientSecret = configuration.getString(ConfigurationKeys.SOCIAL_FACEBOOK_CLIENTSECRET);

    Map<String, String> params = new HashMap<String, String>();
    params.put("client_id", clientId);
    params.put("client_secret", clientSecret);
    params.put("grant_type", "fb_exchange_token");
    params.put("fb_exchange_token", currentToken.getToken());

    RawAPIResponse apiResponse = facebook.callGetAPI("/oauth/access_token", params);

    String response = apiResponse.asString();
    AccessToken newAccessToken = new AccessToken(response);

    facebook.setOAuthAccessToken(newAccessToken);

    return newAccessToken;
}

我认为这可以在每次登录后完成,因此即使访问令牌仍然有效,它也会刷新 - 您将获得有效期为 60 天的更新令牌。

你怎么看?

于 2014-04-12T12:50:43.103 回答
0

我正在扩展 Facebook 课程。他们提供的方法不起作用。所以我写了另一个函数,它确实提供了一个长期存在的令牌,但它在某种程度上是无效的(我尝试使用 token_debug 测试新令牌并尝试用它生成 client_code)!如果我能解决它,我会更新你。如果你能解决它,请更新我。

请记住我没有清理代码,因为我还在写它。

public function GetExtendedAccessToken()
{
    //global $CONFIGURATIONS;
    //$info=$this->api($path,'GET',$args);//doesn't work as api overrides method to post

    $string=file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=".$this->getAppId()
                            ."&client_secret=".$this->getAppSecret()
                            ."&fb_exchange_token=".$this->getAccessToken()
                            ."&grant_type=fb_exchange_token"
                            ."&redirect_uri=".$redirectUri);
    var_dump($string);
    $tokenInfo=explode('&',$string);

    $exAccessToken=str_replace('access_token=', '', $tokenInfo[0]);
    $expiresAt=str_replace('expires=', '', $tokenInfo[1]);
    echo "expires in ". (time()-$expiresAt);
    var_dump($exAccessToken);     
    return $exAccessToken;  
}

现在可以了。有时我会因为未提供 redirect_uri 而收到错误消息。

于 2013-09-26T17:19:38.587 回答