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

Posted

技术标签:

【中文标题】Facebook Graph API 拒绝新创建的访问令牌【英文标题】:Facebook Graph API rejects newly created access token 【发布时间】:2018-05-01 22:01:25 【问题描述】:

今天早些时候,我们的 Web 应用程序的 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 有关,但我看不出这会如何影响我们在每次登录时创建的短期访问令牌。

【问题讨论】:

我的一个网络应用程序得到了相同的响应。我正在使用 Hybridauth 来管理登录。 确认,这里也是 向 FB 提交了一个错误:developers.facebook.com/bugs/194772814474841 天哪。这个问题又来找我了。 @MastaBaba 看看:github.com/mavris/FacebookFix 【参考方案1】:

当我们的集成测试使用测试用户登录时,我遇到了这个问题 - 以下 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 天未与之交互的应用 点击过期应用上的“查看和编辑”按钮 点击弹出窗口中的“更新访问权限”

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

【讨论】:

谢谢!同样的情况,不同的解决方法。我刚刚删除了测试用户并重新创建,因为特定用户对我来说并不重要。为什么这实际上会生成访问令牌但立即失败很奇怪!【参考方案2】:

脸书回复:

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

我要将您的报告与现有报告合并,以便我们处理 将问题集中在一处。请参阅此线程以获取更新: http://developers.facebook.com/bugs/194772814474841/

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

【讨论】:

这是我提交的错误报告,如对我的问题的评论中所述。 bug cmets 中建议了一些解决方法,但它们都不适合我。切换到 JS SDK 不是我的选择。希望我们今天能从 FB 获得更新。【参考方案3】:

更新

这个问题似乎刚刚被 Facebook 解决了。


我在 Facebook 上 filed a bug,他们目前(2018 年 5 月 3 日)正在制定解决方案。

这里和错误 cmets 中建议了几种解决方法。总结一下:

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

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

【讨论】:

我已经在我们的生产系统中推出了解决方案 #2,它适用于我们的案例。 我们已将登录 URL 更改为 https://www.facebook.com/v2.10/dialog/oauth?auth_type=reauthorize&client_id=xxx&state=yyy&response_type=code&sdk=php-sdk-5.6.2&redirect_uri=xxx&scope=email%2Cuser_gender,但这并没有改变任何内容。您是否认为我们必须捕获错误并将用户再次重定向到此 URL? @MikeReiche 幸运的是你不必再做任何事情了【参考方案4】:

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

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

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

【讨论】:

我也发现了。问题是在我的情况下用户刚刚完成了登录流程。我们总是刷新用户令牌,而不是像我在问题中写的那样将其存储在任何地方。 这不是您的令牌,而是 USER 令牌,他们的令牌每 90 天到期一次,因此在这种情况下,他们迫使我们重定向用户重新订阅我们的应用程序 我和@Thomas 在一起:我不存储与登录过程相关的任何内容,然后启动登录过程。因此,在尝试使用 Facebook 登录时,任何可能过期的内容都由 Facebook 提供给我。 我正在使用 Laravel Socialite 并遇到了同样的问题。我不在任何地方存储令牌,坦率地说,我不知道如何让代码将用户发送回“重新订阅”。我的理解是 Facebook 会这样做,而且如果我的用户看到由于这个原因令牌无效,Facebook 自己似乎应该提示他们重新批准该应用程序【参考方案5】:

根据discussionbug持续存在

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

问候

【讨论】:

就我而言,我还需要撤销每个用户的权限,即使我没有存储任何访问令牌!任何重新请求权限的尝试也失败了。我不明白为什么 FB 不能自动优雅地重新询问用户!我注意到这可能与“user_friends”权限的使用有关,现在需要额外的 App 审核。【参考方案6】:

临时解决方案 对于 ios,您需要更改 SDK 代码以支持“重新授权”。为了更改源代码,您需要使用 CocoaPods 下载它。然后将以下函数复制到 pod 上: https://github.com/mavris/FacebookFix

【讨论】:

【参考方案7】:

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

喜欢

安卓: fbLoginButton.setReadPermissions(Arrays.asList(EMAIL));

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

【讨论】:

我的应用是 Web 应用而不是移动应用,我正在申请 emailuser_birthday 权限。 请求权限是否已经有问题?就我而言,我在添加权限后解决了问题。 我也在使用网络应用程序。而且我也已经明确要求获得特定权限。 据我所知,facebook SDK 默认权限是 public_profile 和 email。如果您没有请求默认权限。我建议您应该包含默认权限。 在我的应用程序中解决问题之前,我不请求任何明确的许可。但是今天早上突然出现这个问题。于是我找到了 Facebook 登录 github 示例代码。我发现与我的代码和示例代码不同的部分是请求权限。最后我在我的应用程序中解决了这个问题。所以我想之前Facebook SDK支持默认权限,但是今天改了。

以上是关于Facebook Graph API 拒绝新创建的访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Graph Api 在 facebook 新闻提要中获取“新添加的照片到相册”

Facebook Graph API v2.4 不返回扩展用户数据

Facebook Graph API:有应用访问令牌,需要用户访问令牌而无需交互

向 Facebook 查询正在使用/可以使用的 Graph API 版本

如何使用新的 facebook graph api v2.4 从页面获取事件

有啥方法可以通过 API 创建 facebook 事件,因为 graph api 不再可用