CSRF检测修复provider_ignores_state:在成功设计Devise Omniauth-Facebook身份验证后,不保存会话

时间:2017-02-15 04:40:31

标签: ruby-on-rails facebook devise omniauth omniauth-facebook

我的应用程序运行正常,然后我更新到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。

这让我很生气 - 这是一个错误,还是解决了这个问题?

2 个答案:

答案 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)。留在这里,以防将来其他人遇到类似的问题!