为什么Facebook访问令牌改变了每一次访问?

时间:2013-09-06 06:45:00

标签: java facebook facebook-graph-api facebook-access-token restfb

我们正在使用restFB 1.6.12。我以两种方式获取facebook访问令牌,

1. CLIENT_APP_ID = "XXXXXXXXXXXXXXXXXX"; 
   CLIENT_SECRET = "XXXXXXXXXXXXXXXXXX"; 
   REDIRECT_URL  = "XXXXXXXXXXXXXXXXXX";
   AUTH_CODE = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; 
   SCOPE = "email,read_stream";

    Redirect to facebook as the example. As a result I'll get an
    authorization code  
    https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream

    asking for an access_token using,

    https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

    this returns the access token like this,

    access_token=CAAHWfjdHDKcBAIL0zHMeJKzJw8Ug7WrrrkNxpBnK7ubnFR1RGtIIZA7T3UPlhCSV0hPJXZAgTcKfBSfHZAyxsndc3RT72XMREjACxnGb0ZCGMZAUgDWH3FgOhnaoSBMgkaQBPDOCCEKcLnznMYSncWS7dVxl9IFrSzeFjF6LKOWB3NTynl5X1&expires=5125218

 2. AccessToken accessToken = new
    DefaultFacebookClient().obtainAppAccessToken(appid,appsecret);
    String token=accessToken.getAccessToken();

    It reurns the access token like this,

    access_token=517312558337191|5oHY9T3cZICO_TCeK8OdXKg5Y08

如果我使用第一个(1),它在第一次访问后工作正常,然后每次访问都会抛出错误

Auth Token= {"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}

如果我使用第二个(2),它只适用于publicSearchMessages,但是当我访问publicEvents或其他搜索时会抛出错误

com.restfb.exception.FacebookOAuthException: Received Facebook error response of type OAuthException: (#200) Must have a valid access_token to access this endpoint
    at com.restfb.DefaultFacebookClient$DefaultGraphFacebookExceptionMapper.exceptionForTypeAndMessage(DefaultFacebookClient.java:766)
    at com.restfb.DefaultFacebookClient.throwFacebookResponseStatusExceptionIfNecessary(DefaultFacebookClient.java:688)
    at com.restfb.DefaultFacebookClient.makeRequestAndProcessResponse(DefaultFacebookClient.java:630)
    at com.restfb.DefaultFacebookClient.makeRequest(DefaultFacebookClient.java:592)
    at com.restfb.DefaultFacebookClient.makeRequest(DefaultFacebookClient.java:556)
    at com.restfb.DefaultFacebookClient.fetchConnection(DefaultFacebookClient.java:219)

我的问题是,这两个访问令牌之间的区别是什么?我如何以编程方式生成第一个访问代码的访问代码以使用publicSearchMessages,getPublicEvents和其他搜索?

使用哪一个访问令牌按预期工作?

1 个答案:

答案 0 :(得分:1)

Access_tokens允许用户以安全和社交的方式与您的应用进行互动。当我们通过App Dashboard中的迁移设置删除offline_access权限的使用时,我们现在允许该选项使用access_tokens,其具有可以在用户重新访问应用程序时续订的长期过期时间

当用户使用现有的,有效的,短期用户access_token访问您的站点时,您可以选择延长该访问令牌的到期时间。 每天延长一次到期时间,因此即使用户每天多次重访您的网站,该令牌也会在第一次请求时延长。您必须确保在短暂的access_token到期之前调用下面的新端点。 使用下面的新端点,您将能够延长现有的,未过期的,短期用户access_token的到期时间。

要获取长期存在的用户access_token,只需将您自己的client_id(您的app_id),您的app_secret以及未过期的短期access_token传递给端点。您将返回一个新的长期用户access_token;除了传递到端点

的短期access_token之外,此access_token还将存在

简而言之,获取page access令牌 - 默认情况下不会过期;并确保使用long-time user access token

进行此操作

您可以访问facebook doc here了解更多信息

要获得扩展的页面访问令牌,请将用户访问令牌交换为长期访问令牌,然后请求Page令牌。页面的这个“扩展”令牌实际上没有任何到期时间。

https://developers.facebook.com/docs/howtos/login/extending-tokens/#step1

通过执行curl请求并手动将“页面访问令牌”保存在代码中来解决此问题