他们在AccessToken docu上说:“使用Facebook SDKs的本地移动应用程序将获得长时间的访问令牌,有效期约为60天。当使用应用程序的人向Facebook服务器提出请求时,这些令牌将每天刷新一次。”
这是否意味着,只有当对Facebook服务器的请求是从客户端Android应用程序(我不知道如何解释“.使用您的应用程序的人.”)那么访问令牌将被刷新吗?
在我的应用程序中,我使用AccessToken.getCurrentAccessToken()
检索访问令牌,将访问令牌发送到我的服务器,服务器向Facebook的服务器发出请求,目的是验证接收到的访问令牌。
在这种情况下,访问令牌也会被刷新吗?(在这种情况下,服务器正在对FB的服务器执行请求,而不是直接“使用我的应用程序的人”)
AccessToken.getCurrentAccessToken()
是否返回刷新的访问令牌?谢谢
编辑:这可能有助于其他人节省时间:我发现访问令牌在初始化FacebookSDK时是在一定条件下自动刷新的(FacebookSDK并没有清楚地解释访问令牌是如何刷新的--参见上面的问题)。
请注意,我正在使用FacebookSDK 4.0的安卓。
按照下面的步骤:
FacebookSDK.sdkInitialize(Context, InitializeCallback)
if (AccessToken.getCurrentAccessToken() != null && Profile.getCurrentProfile() == null)
Profile.fetchProfileForCurrentAccessToken()
Utility.getGraphMeRequestWithCacheAsync()
GraphRequest graphRequest = getGraphMeRequestWithCache(accessToken); graphRequest.setCallback(graphCallback); graphRequest.executeAsync();
executeBatchAsync(GraphRequestBatch requests)
GraphRequestAsyncTask asyncTask = new GraphRequestAsyncTask(requests); asyncTask.executeOnSettingsExecutor();
GraphRequestAsyncTask doInBackground()
方法if (connection == null) { return requests.executeAndWait(); } else { return GraphRequest.executeConnectionAndWait(connection, requests); }
对于这两种情况,代码都将在此方法中结束:
public static List<GraphResponse> executeConnectionAndWait(
HttpURLConnection connection,
GraphRequestBatch requests)
AccessTokenManager.getInstance().extendAccessTokenIfNeeded();
行。顾名思义,它最多每天会扩展一次访问令牌。发布于 2015-12-18 12:00:07
您可以使用refreshCurrentAccessTokenAsync
方法:
AccessToken.refreshCurrentAccessTokenAsync();
发布于 2020-08-19 14:41:50
文件规定(重点是地雷):
当您使用iOS、安卓或JavaScript SDK时,如果用户在过去90天内使用了您的应用程序,SDK将自动刷新令牌。使用Facebook SDKs的本地移动应用程序可以获得长寿命的用户访问令牌,有效期约为60天。当使用您的应用程序的人员向Facebook的服务器发出请求时,这些令牌每天刷新一次。
这意味着,如果您使用官方的SDK内置图形API客户端(GraphRequest
和朋友),那么在每次请求之后,SDK就会尝试刷新令牌 (但不是每天一次)。
为此,SDK使用无文档化的Graph:
https://graph.facebook.com/v3.2/oauth/access_token?access_token={user-access-token}&grant_type=fb_extend_sso_token&client_id={your-app_id}
(它可能在所有图形API版本中都可用,但我还没有对它进行测试)
Android还使用refreshCurrentAccessTokenAsync
方法直接在公共API中公开此令牌刷新功能。
值得注意的是,令牌刷新只适用于所谓的"SSO“令牌,即那些从Facebook应用程序接收的令牌。如果用户没有在他们的设备上安装Facebook应用程序,或者由于任何其他原因登录流使用了webview变体,那么接收到的令牌将永远不会通过刷新。据我所知,这里没有记载。
当您试图刷新从webview流接收到的令牌时,上面提到的无文档API返回一个400
错误:
HTTP/1.1 400 Bad Request
...
{"error":{"message":"(#10) The access token was not obtained using single sign-on","type":"OAuthException","code":10,"fbtrace_id":"AbGFcwx4aOhY0sgEkLdAR34"}}
这个完整的答案是考虑到Android的,但我假设它也适用于iOS SDK (但我还没有测试过)。
https://stackoverflow.com/questions/31369906
复制相似问题