繁体   English   中英

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

[英]CSRF Detection fix provider_ignores_state: true not saving session after successful Devise Omniauth-Facebook Authentication

我的应用程序运行正常,然后我更新到 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() - 然后身份验证失败并重定向回 users/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。

这让我很生气 - 这是一个错误,还是有解决这个问题的方法?

我们对omniauth-github出现了同样的错误。 为我们修复它的(除了provider_ignores_state: true hack 之外)是指向 github 身份验证站点的链接中的 URL。 最初我们输入了 github OAuth 的整个 URL( https://github.com/login/oauth/authorize?client_id=#{ENV["GITHUB_CLIENT_ID"]}&scope=repo ),但将其更改为 omniauth 格式只是/auth/github修复了这个 CSRF 错误(以及当我们尝试模拟/测试我们的 OAuth 时没有找到路由的错误)。 留在这里以防其他人将来遇到类似的问题!

我终于能够解决这个问题,但我仍然不明白出了什么问题。 基本上,创建了一个“空”的 Rails 5 项目,并使用 omniauth-facebook gem 和我的主应用程序设置设置了一个全新的设计 - 部署到临时服务器的克隆实例并且它工作了! 大多数代码是相同的; 但是当我用新应用程序中的一个替换 devise.rb 初始值设定项时,旧代码又继续在 stagingg 服务器上工作。 有趣的是,我处理了从旧应用程序到新应用程序的 Omniauth 配置,所以一定是 Devise 的另一个模块出了问题……而不是 Omniauth 本身。

无论哪种情况,它现在都在工作。 所以我会把它放在床上并留在这里以防其他人遇到同样的问题; 虽然我不能说具体出了什么问题,但这些是我用来调试/修复我的特定问题的步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM