Facebook4J支持交换访问令牌

Facebook4J支持交换访问令牌,facebook,oauth,facebook-access-token,Facebook,Oauth,Facebook Access Token,我正在寻找一种方法,在我们的后端将短期访问令牌交换为Facebook描述的长期访问令牌。如何使用facebook4j实现这一点?我正在扩展Facebook类。他们提供的方法不起作用。因此,我编写了另一个函数,它确实提供了一个长寿命的令牌,但它在某种程度上是无效的(我尝试用token_debug测试新令牌,并尝试用它生成客户机代码)!如果我能解决这个问题,我会告诉你的。如果你能解决它,请告诉我最新情况 请记住我没有清理代码,因为我还在写代码 public function GetExtendedA

我正在寻找一种方法,在我们的后端将短期访问令牌交换为Facebook描述的长期访问令牌。如何使用facebook4j实现这一点?

我正在扩展Facebook类。他们提供的方法不起作用。因此,我编写了另一个函数,它确实提供了一个长寿命的令牌,但它在某种程度上是无效的(我尝试用token_debug测试新令牌,并尝试用它生成客户机代码)!如果我能解决这个问题,我会告诉你的。如果你能解决它,请告诉我最新情况

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

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;  
}

现在可以了。有时我会因为没有提供重定向uri而出错

我已经做了类似的事情来将旧令牌交换为新令牌:

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;
}
private AccessToken refreshToken(Facebook,AccessToken currentToken)引发异常{
String clientId=configuration.getString(ConfigurationKeys.SOCIAL\u FACEBOOK\u clientId);
String clientSecret=configuration.getString(ConfigurationKeys.SOCIAL\u FACEBOOK\u clientSecret);
Map params=新的HashMap();
参数put(“客户id”,客户id);
参数put(“客户秘密”,clientSecret);
参数put(“授予类型”、“fb交换令牌”);
参数put(“fb_交换_令牌”,currentToken.getToken());
RawAPIResponse=facebook.callGetAPI(“/oauth/access_-token”,参数);
String response=apiResponse.asString();
AccessToken newAccessToken=新AccessToken(响应);
setOAuthAccessToken(newAccessToken);
返回newAccessToken;
}
我认为这可以在每次登录后完成,因此即使访问令牌仍然有效,也会刷新它-您将只获得有效期为60天的较新令牌


你觉得怎么样?

看起来不错,虽然我认为facebook的库中会/应该有一个预编程的解决方案,但我发现这个错误:线程“main”java.lang.IllegalStateException中出现异常:身份验证凭据丢失。在facebook4j.FacebookBaseImpl.ensureAuthorizationEnabled(FacebookBaseImpl.java:154)上,我得到了一个正常的错误“身份验证凭据丢失”@DT7:您找到了获取新tocken的方法吗???