Facebook:在Android上刷新AccessToken

时间:2015-07-12 16:18:44

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

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

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

谢谢

编辑:这可以帮助其他人节省时间: 我发现访问令牌在某些条件下会在初始化FacebookSDK时自动刷新(Facebook文档没有清楚地解释访问令牌是如何刷新的 - 请参阅上面的问题)。
请注意我使用的是FacebookSDK 4.0 for Android 请按照下面的步骤进行操作:

  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()方法
  6. 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();行。 顾名思义,每天最多会扩展一次访问令牌。

2 个答案:

答案 0 :(得分:9)

使用

   AccessToken.refreshCurrentAccessTokenAsync();

答案 1 :(得分:1)

文档说明(重点是我):

当您使用iOS,Android或JavaScript SDK时,SDK将 自动刷新令牌(如果该人在 最近90天。使用Facebook的SDK的本地移动应用获得 寿命长的用户访问令牌,有效期约60天。这些代币 每天刷新一次,当使用您的应用程序的人员 请求到Facebook的服务器

的含义是,如果您使用 SDK内置的官方Graph API客户端客户端(GraphRequest和朋友),则在每次请求SDK之后将attempt to refresh the token(但每天不多见)。

为此,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(但我尚未对此进行测试)。