我的应用程序运行正常,然后我更新到Rails 5.0.1。在此之后,我的应用程序不再使用Facebook进行身份验证,并在日志中出现以下错误:
Authentication failure! csrf_detected:
OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
因此,根据StackOverflow建议的人,我更改了我的omniauth配置,以包含provider_ignores_state: true
设置,该设置可以抑制该错误。
config.omniauth :facebook, 'xxx', 'xxxxxxxxxxxxx',{
scope: 'public_profile,email,user_birthday,etc...',
info_fields: 'name,first_name,etc...',
provider_ignores_state: true
}
这使一切正常;至少在本地运行的开发中,但当我将代码推送到我的登台服务器时,应用程序成功通过Facebook进行身份验证,据称“签署”用户并重定向到root_path()
- 然后验证失败并重定向回用户/ sign_in。
为了帮助诊断问题,我将一条记录线放在相关的呼叫之上(以查看它是否正在执行),例如:
logger.debug " (OmniauthCallbacksController#facebook) about to sign_in_and_redirect with id: #{@user.id} email: #{@user.email} uid: #{@user.provider_uid}"
sign_in_and_redirect @user, event: :authentication
我在那里的Facebook提供商的OmniauthCallbacksController处理程序似乎确实达到'sign_in_and_redirect' - 但由于我无法在我的暂存环境中确定的原因,它实际上从未将会话实际保存到cookie。日志中没有错误(在调试模式下)以证明抛出了任何类型的异常 - 除了用于递增用户的log_in_count的查询实际上不运行任何查询:
(2.4ms) COMMIT
(0.2ms) BEGIN
(0.2ms) COMMIT
这看起来很奇怪(没有实际的更新查询,而在开发中我可以看到log_in_count等增加)。但它是出现问题的唯一其他迹象。之后,它无法通过authenticate_user!
检查并重定向回sign_in_url。
这让我很生气 - 这是一个错误,还是解决了这个问题?
答案 0 :(得分:0)
我终于能够解决这个问题,但我仍然不明白出了什么问题。基本上,创建了一个“空”Rails 5项目,并使用我的主应用程序的omniauth-facebook gem和设置设置了一个全新的设计 - 部署到登台服务器的克隆实例,它工作正常!大部分代码都是一样的;但是当我用新应用程序替换devise.rb初始化程序时,旧代码再次继续在stagingg服务器上运行。有趣的是,我将旧的Omniauth配置应用到了新应用程序中,因此对于Devise的另一个模块来说一定有问题......而不是Omniauth本身。
在任何一种情况下,它现在都在工作。所以我会把它放在床上,留在这里以防其他人遇到同样的问题;虽然我不能说什么是特别错误,但这些是我用来调试/修复我的特定问题的步骤。
答案 1 :(得分:0)
omniauth-github
出现相同的错误。除了provider_ignores_state: true
hack之外,为我们修复的原因是指向github的身份验证站点的链接中的URL。最初,我们输入了github OAuth(https://github.com/login/oauth/authorize?client_id=#{ENV["GITHUB_CLIENT_ID"]}&scope=repo
)的整个URL,但是将其更改为仅/auth/github
的omniauth格式可以解决此CSRF错误(以及尝试模拟时出现的未找到路由错误) /测试我们的OAuth)。留在这里,以防将来其他人遇到类似的问题!