使用服务器端流程自动刷新过期的访问令牌

时间:2012-04-06 10:27:21

标签: facebook facebook-graph-api facebook-oauth

这个话题似乎有点混乱,我很难得到一个明确的答案,所以这是我的问题......

我正在使用服务器端流来获取我的网络应用程序的访问令牌,我之前使用的是offline_access,现在正在折旧,所以我需要一种方法在以下情况下刷新令牌:

1)用户更改FB密码 2)令牌自然过期

我的应用程序将结果发布到用户FB墙,因此刷新需要由我们的服务器自动完成(无cookie或OAuth对话框)

我以为我可以尝试使用此处描述的新端点

http://developers.facebook.com/roadmap/offline-access-removal/

,使用以下代码片段(Java):

public static String refreshFBAccessToken(String existingAccessToken)
        throws Exception{
    //Currently not working
    String refreshUrl = "https://graph.facebook.com/oauth/access_token?
        client_id="+FacebookApp.appId+"
        &client_secret="+FacebookApp.appSecret+"
        &grant_type=fb_exchange_token
        &fb_exchange_token="+existingAccessToken;
    URL url = new URL(refreshUrl);
    URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(),
            url.getQuery(), null);
    String result = readURL(uri.toURL());
    String[] resultSplited = result.split("&");
    return resultSplited[0].split("=")[1];
}

但这似乎不起作用(我得到了响应400),当我重新阅读文档时,似乎这个端点仅用于使用客户端流程获得的令牌...

那么服务器端流程怎么样??

有人可以告诉我上述方法是否正确或有其他方式吗?

非常感谢

2 个答案:

答案 0 :(得分:3)

根据我的理解,没有用于刷新令牌的服务器端流程。

刷新令牌调用需要包括用户身份验证过程的响应,这是一个短期令牌。

您需要将刷新令牌流程包含在用户登录流程中,或者如果这不适用于您的设置,则需要通过电子邮件向用户发送电子邮件,要求他们回来!

答案 1 :(得分:1)

我不懂java但语法非常像C#,所以我可以说,你做的一切都很正确。

但我怀疑这个函数readURL做了什么?

如果它像php的get_file_contents()一样工作(即如果它得到HTTP获取),我想这不是一种正确的方法。

根据我在google刷新令牌方法方面的经验,我认为您应该使用HTTP POST而不是HTTP GET来获取网址。