Facebook Graph API 拒绝新创建的访问令牌

Facebook Graph API rejects newly created access token

今天早些时候,我们网络应用程序的 Facebook 登录流程对某些用户停止工作。当我们尝试获取当前配置文件时,会返回一个错误。它声称我们刚刚通过将用户重定向到 OAuth 登录流程而生成的访问令牌已被拒绝。

给出的原因是:

The access token is invalid since the user hasn't engaged the app in longer than 90 days

对我来说,这没有意义,因为 我们不会 将访问令牌存储在当前会话以外的任何地方,并在用户每次使用 Facebook 登录时重新创建它。

来自 Spring Social 的 GET /me 调用的堆栈跟踪如下所示:

ERR c.s.f.v.resource.AuthenticationResource Exception when connecting with Facebook
org.springframework.social.RevokedAuthorizationException: The authorization has been revoked. Reason: The access token is invalid since the user hasn't engaged the app in longer than 90 days.
        at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleFacebookError(FacebookErrorHandler.java:85)
        at org.springframework.social.facebook.api.impl.FacebookErrorHandler.handleError(FacebookErrorHandler.java:59)
        at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
        at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:775)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:728)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:702)
        at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:350)
        at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:220)
        at org.springframework.social.facebook.api.impl.FacebookTemplate.fetchObject(FacebookTemplate.java:215)

这个问题可能与 changes in the Facebook API 有关,但我看不出这对我们在每次登录时创建的短期访问令牌有何影响。

在您的应用中添加权限代码

Android : fbLoginButton.setReadPermissions(Arrays.asList(电子邮件));

IOS: loginButton.readPermissions = @[@"public_profile", @"email"];

我在 FB 文档中找到了这个 link: Refreshing User Access Tokens

其中提到 90 天后用户必须重新建立他们的令牌,因此如果出现此类错误,我们应该重定向用户重新注册。

他们甚至提到他们在本文档的顶部删除了非活跃用户的令牌。也许他们犯了一个错误并删除了所有用户令牌。 无论如何,解决方案是重定向用户重新订阅。

Facebook 回复:

Thanks for getting in touch. This is actually a known issue that we are already tracking in another bug report.

I'm going to merge your report with the existing one, so we can deal with the issue in one place. Please refer to this thread for updates: http://developers.facebook.com/bugs/194772814474841/

我的临时解决方案是使用 JS SDK,它在我的情况下工作正常...

更新:

这个问题似乎刚刚被 Facebook 修复了。


filed a bug 与 Facebook 合作,他们目前 (5/3/18) 正在制定解决方案。

此处和错误评论中建议了几种解决方法。总结:

  1. 添加您之前未请求的新权限以强制重新授权
  2. 捕获错误并通过auth_type=reauthorize
  3. 手动重新授权用户
  4. 切换到JS SDK并使用客户端登录

我选择解决方案 #2,因为它似乎是最直接的方法。

根据 discussion

错误仍然存​​在

根据用户对上述讨论的评论,我们撤销了我们应用程序的每个用户的权限并且它起作用了。为此,我们使用了下一个图表 api endpoint。我们必须保留用户的 facebookID。

此致

临时解决方案 对于 iOS,您需要更改 SDK 代码以支持 "reauthorize"。为了更改源代码,您需要使用 CocoaPods 下载它。然后将以下函数复制到 pods 上: https://github.com/mavris/FacebookFix

当我们的集成测试使用测试用户登录时,我 运行 遇到了这个问题 - 以下 JSON 从图表 API 返回:

{
    "error": {
        "message": "The access token is invalid since the user hasn't engaged the app in longer than 90 days.",
        "type": "OAuthException",
        "code": 190,
        "error_subcode": 493,
        "fbtrace_id": "F/1z2AsTRx8"
    },
    "timestamp_microsecond": "2018-05-30 11:22:01.353949"
}

这是一个更大的问题,因为我们的测试用户并不 "engage" 使用该应用程序。要解决这个问题,我必须:

  • 登录 FB 开发者网站
  • 找到有问题的应用程序
  • 在角色下查找 -> 测试用户以找到正确的用户
  • 单击用户的编辑按钮,然后单击 "Login as this test user"
  • 登录后,转到“设置”->“应用程序和网站”
  • 在 "Expired" 选项卡中查找用户超过 90 天未与之交互的应用程序的应用程序
  • 单击已过期应用程序上的 "View & Edit" 按钮
  • 在弹出窗口中单击 "Renew Access"

完成所有这些步骤后,我的测试用户(和集成测试)再次工作。