【问题标题】:Facebook: refresh AccessToken on AndroidFacebook:在 Android 上刷新 AccessToken
【发布时间】:2020-08-19 22:41:50
【问题描述】:

他们在AccessToken docu 中说:“使用 Facebook 的 SDK 的原生移动应用程序将获得长期访问令牌,有效期约为 60 天。这些令牌将在使用您的应用程序的人每天刷新一次对 Facebook 服务器的请求。”
这是否意味着只有当对 Facebook 的服务器的请求是从客户端 Android 应用程序发出的(我不确定如何解释“……使用您的应用程序的人……”)时,才会刷新访问令牌?
在我的应用程序中,我使用 AccessToken.getCurrentAccessToken() 检索访问令牌,将访问令牌发送到我的服务器,然后服务器向 Facebook 的服务器发出请求,目的是验证收到的访问令牌。
在这种情况下,访问令牌也会被刷新吗? (在这种情况下,服务器正在向 FB 的服务器发出请求,而不是直接“使用我的应用程序的人”)

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

谢谢

编辑:这可能有助于其他人节省时间: 我发现访问令牌在某些条件下会在初始化 FacebookSDK 时自动刷新(Facebook 文档没有清楚地解释如何刷新访问令牌 - 请参阅我上面的问题)。
请注意我正在使用适用于 Android 的 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); }

对于这两种情况,代码都会以这种方法结束:

public static List<GraphResponse> executeConnectionAndWait(
            HttpURLConnection connection,
            GraphRequestBatch requests)
  1. 通知AccessTokenManager.getInstance().extendAccessTokenIfNeeded(); 行。 顾名思义,这将每天最多扩展一次您的访问令牌。

【问题讨论】:

  • 是的,在这种情况下,服务器正在发出刷新访问令牌的请求,并将接收新的访问令牌。但是,该应用程序不会意识到这一点。任何后续的 API 请求都将继续使用旧的访问令牌发出,并且会失败。
  • @subeeshb 我没有请求刷新服务器上的访问令牌。我只是调用 /me .... GRAPH API 请求。我猜你不是说每个简单的 GRAPH API 请求都包含一个刷新访问令牌的请求。

标签: facebook facebook-graph-api facebook-access-token facebook-authentication facebook-sdk-4.0


【解决方案1】:

您可以使用refreshCurrentAccessTokenAsync 方法:

AccessToken.refreshCurrentAccessTokenAsync();

【讨论】:

  • 这真是个救命恩人 :)
  • 这只会在可能的情况下刷新过期日期。我已经检查过调用此函数后过期日期可以保持不变。那是因为现在令牌会在 60 天后过期。然后您需要再次要求用户使用 Facebook 登录以更新令牌。
  • 但我不能。调用时失败。错误:无法刷新访问令牌。我正在使用 facebook 测试用户。已更改密码并重新登录。还是不行。
  • 老兄,这是旧的SDK,FB对SDK做了很多新的改变。我不确定它今天是否也能正常工作。
  • 除非用户通过 facebook 应用程序登录,否则这将不起作用,因为它们仅允许出于某种原因扩展 sso 令牌...如果用户通过浏览器登录,令牌将保持不变。
【解决方案2】:

文档状态(强调我的):

当您使用 iOS、Android 或 JavaScript SDK 时,SDK 将 自动刷新令牌,如果此人在其中使用过您的应用 过去 90 天。使用 Facebook 的 SDK 的原生移动应用程序获得 长寿命用户访问令牌,有效期约为 60 天。这些代币 每天刷新一次,当使用您的应用的人进行 向 Facebook 的服务器发出请求

的意思是如果你使用官方SDK内置的Graph API客户端(GraphRequest和朋友),那么在每次请求之后SDK都会@ 987654322@(但不是一天一次)。

为此,SDK 使用了未记录的 Graph API:

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}

(它可能在所有 Graph API 版本中都可用,但我没有测试过)

Android SDK 还使用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(但我还没有测试过)。

【讨论】:

  • 感谢这个小金块。我刚刚花了几个小时在启动时查看我们的应用程序身份验证代码,试图弄清楚为什么一小部分 Android 用户会在很长一段时间后退出,但不是全部。基本上,如果他们使用 Webview,他们的会话将在 60 天后过期,唯一的办法就是让他们再次登录。 Doh - 如果 FB 在某个地方记录了这个“功能”,那就太好了!
猜你喜欢
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2019-01-29
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多