我们正在使用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和其他搜索?
使用哪一个访问令牌按预期工作?
答案 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请求并手动将“页面访问令牌”保存在代码中来解决此问题