首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Facebook:在Android上刷新AccessToken

Facebook:在Android上刷新AccessToken
EN

Stack Overflow用户
提问于 2015-07-12 16:18:43
回答 2查看 6K关注 0票数 6

他们在AccessToken docu上说:“使用Facebook SDKs的本地移动应用程序将获得长时间的访问令牌,有效期约为60天。当使用应用程序的人向Facebook服务器提出请求时,这些令牌将每天刷新一次。”

这是否意味着,只有当对Facebook服务器的请求是从客户端Android应用程序(我不知道如何解释“.使用您的应用程序的人.”)那么访问令牌将被刷新吗?

在我的应用程序中,我使用AccessToken.getCurrentAccessToken()检索访问令牌,将访问令牌发送到我的服务器,服务器向Facebook的服务器发出请求,目的是验证接收到的访问令牌。

在这种情况下,访问令牌也会被刷新吗?(在这种情况下,服务器正在对FB的服务器执行请求,而不是直接“使用我的应用程序的人”)

  • 如果是,Android客户端应用程序中的Facebook是如何知道我的服务器向Facebook的服务器发出请求的?安卓客户端中的AccessToken.getCurrentAccessToken()是否返回刷新的访问令牌?

谢谢

编辑:这可能有助于其他人节省时间:我发现访问令牌在初始化FacebookSDK时是在一定条件下自动刷新的(FacebookSDK并没有清楚地解释访问令牌是如何刷新的--参见上面的问题)。

请注意,我正在使用FacebookSDK 4.0的安卓。

按照下面的步骤:

  1. FacebookSDK.sdkInitialize(Context, InitializeCallback) if (AccessToken.getCurrentAccessToken() != null && Profile.getCurrentProfile() == null)
  2. Profile.fetchProfileForCurrentAccessToken()
  3. Utility.getGraphMeRequestWithCacheAsync() GraphRequest graphRequest = getGraphMeRequestWithCache(accessToken); graphRequest.setCallback(graphCallback); graphRequest.executeAsync();
  4. . executeBatchAsync(GraphRequestBatch requests) GraphRequestAsyncTask asyncTask = new GraphRequestAsyncTask(requests); asyncTask.executeOnSettingsExecutor();
  5. GraphRequestAsyncTask doInBackground()方法

if (connection == null) { return requests.executeAndWait(); } else { return GraphRequest.executeConnectionAndWait(connection, requests); }

对于这两种情况,代码都将在此方法中结束:

代码语言:javascript
运行
复制
public static List<GraphResponse> executeConnectionAndWait(
            HttpURLConnection connection,
            GraphRequestBatch requests)
  1. 注意AccessTokenManager.getInstance().extendAccessTokenIfNeeded();行。顾名思义,它最多每天会扩展一次访问令牌。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-18 12:00:07

您可以使用refreshCurrentAccessTokenAsync方法:

代码语言:javascript
运行
复制
AccessToken.refreshCurrentAccessTokenAsync();
票数 9
EN

Stack Overflow用户

发布于 2020-08-19 14:41:50

文件规定(重点是地雷):

当您使用iOS、安卓或JavaScript SDK时,如果用户在过去90天内使用了您的应用程序,SDK将自动刷新令牌。使用Facebook SDKs的本地移动应用程序可以获得长寿命的用户访问令牌,有效期约为60天。当使用您的应用程序的人员向Facebook的服务器发出请求时,这些令牌每天刷新一次。

这意味着,如果您使用官方的SDK内置图形API客户端(GraphRequest和朋友),那么在每次请求之后,SDK就会尝试刷新令牌 (但不是每天一次)。

为此,SDK使用无文档化的Graph:

代码语言:javascript
运行
复制
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错误:

代码语言:javascript
运行
复制
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 (但我还没有测试过)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31369906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档