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

时间:2018-05-01 22:01:26

标签: facebook facebook-graph-api-v2.0 spring-social-facebook

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

给出的理由是:

  

访问令牌无效,因为用户未在超过90天内使用该应用

对我来说,这没有任何意义,因为我们不会将访问令牌存储在除当前会话之外的任何位置,并在每次用户使用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有关,但我不知道这会如何影响我们在每次登录时创建的短期访问令牌。

7 个答案:

答案 0 :(得分:11)

当我们使用测试用户登录集成测试时遇到了这个问题 - 以下JSON从Graph 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"
}

由于我们的测试用户不参与"与应用程序一样。要解决这个问题,我必须:

  • 登录FB开发者网站
  • 找到有问题的应用
  • 在角色下看 - >测试用户以找到合适的用户
  • 点击该用户的“编辑”按钮,然后点击"以此测试用户身份登录"
  • 登录后,请转到设置 - >应用程序&网站
  • 在"已过期"中找到应用程序用户未与超过90天进行过互动的应用的标签
  • 点击"查看&编辑"已过期应用上的按钮
  • 点击"续订访问权限"在弹出窗口中

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

答案 1 :(得分:7)

facebook回复:

  

感谢您与我们保持联系。这实际上是我们已知的问题   已经在另一个错误报告中跟踪。

     

我要将您的报告与现有报告合并,因此我们可以处理   把问题放在一个地方。请参阅此主题以获取更新:   http://developers.facebook.com/bugs/194772814474841/

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

答案 2 :(得分:6)

<强>更新

问题似乎刚刚由Facebook修复。

filed a bug与Facebook,他们目前(5/3/18)正在制定决议。

这里和bug评论中提出了几种解决方法。总结一下:

  1. 添加您之前未要求强制重新授权的新权限
  2. 抓住错误并通过auth_type=reauthorize
  3. 手动重新授权用户
  4. 切换到JS SDK并使用客户端登录
  5. 我正在寻找解决方案#2,因为它似乎是最直接的方式。

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

根据discussion

,错误仍然存​​在

根据用户对上述讨论的评论,我们撤销了我们应用的每个用户的权限,并且有效。为此,我们使用了下一个图表api endpoint。我们必须坚持用户&#39; facebookIDs。

此致

答案 5 :(得分:0)

临时解决方案 对于iOS,您需要更改SDK代码以支持&#34;重新授权&#34;。要更改源代码,您需要使用CocoaPods下载它。然后通过pod复制以下功能: https://github.com/mavris/FacebookFix

答案 6 :(得分:-1)

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

喜欢

Android: fbLoginButton.setReadPermissions(Arrays.asList(EMAIL));

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