我们的网络应用程序允许用户通过 Facebook 登录。从技术上讲,我们使用的是 Facebook OAuth2。我们两年前就实现了这个登录流程。在 2015 年 11 月 13 日之前它都运行良好,但从那天起就不再运行了。当我们的服务器发送请求时 https://graph.facebook.com/oauth/access_token 使用适当的参数(
client_id
、redirect_uri
、client_secret
、code
),来自 Facebook 的响应的 HTTP 状态为 400。响应正文是一个 HTML 页面,显示“抱歉,出了点问题”。
11月13日,Facebook可能出现了一些问题。 我发现以下消息: http://www.independent.co.uk/life-style/gadgets-and-tech/news/facebook-down-site-breaks-for-many-people-though-not-for-everyone-a6732906.html
但是,一周后我们的服务器仍然收到此错误响应。我们在生产环境中部署了一个系统实例,在测试环境中又部署了一个实例(具有不同的 Facebook 帐户,即具有不同的
client_id
和 client_secret
)。目前,Facebook登录在测试环境中运行良好。我不确定11月13日是否有效。
您有从此类问题中恢复的经验吗?为什么同一应用程序中 Facebook 登录在测试环境中有效,而在生产环境中不起作用?为什么生产实例在某一天崩溃了,一周后仍然崩溃?
感谢您的帮助。
我也有同样的问题。我认为该问题源于您的身份验证请求中传递了无效范围。尝试删除身份验证请求中的范围以查看是否有效。
我在 2022 年发现的另一个极端案例: 在应用程序仪表板中,如果您选择
Facebook login for Business
,则会发生相同的错误。一旦您选择 Facebook Login
一个,它就会消失。
最后通过重启servlet容器(Tomcat 7)解决了问题。不过,我不知道为什么。
所有这一切都仅使用登录按钮。不是 API 服务器端,也不是
FB.login()
。它有时对我有用,有时不起作用,我不明白为什么。我会打开一个新窗口,它可能会起作用,也可能不会 - 但似乎一旦打破它就被打破了。
查看 SDK Javascript(即 Facebook 登录按钮使用的 SDK),它会检查设备是否是“触摸”设备,如果是,则在请求 oauth 令牌时将使用
m.facebook.com
域。
但是,如果页面加载时未激活移动设备模式,则它使用
www.facebook.com
并成功:
所以对我来说当前的解决方法是:
m.facebook.com
,那么您做得不够快,或者您可能正在使用 Angular 之类的热重载工具,并且需要手动刷新。我通过简单地删除或调整范围来解决问题,问题就为我解决了。因此,请尝试调整或删除您的范围。