首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CSRF检测修复provider_ignores_state:成功设计Omniauth-Facebook身份验证后不保存会话

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

Stack Overflow用户
提问于 2017-02-15 12:40:31
回答 2查看 2.6K关注 0票数 1

我的应用程序运行正常,然后我更新到了Rails 5.0.1。在此之后,我的应用程序不再通过Facebook的身份验证,并在日志中出现以下错误:

代码语言:javascript
运行
复制
Authentication failure! csrf_detected: 
OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

因此,根据人们在StackOverflow上的建议,我更改了我的omniauth配置,以包含provider_ignores_state: true设置,从而抑制了该错误。

代码语言:javascript
运行
复制
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。

为了帮助诊断问题,我在相关调用的上方放置了一条日志记录行(以查看它是否正在执行),例如:

代码语言:javascript
运行
复制
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的查询实际上并没有运行任何查询:

代码语言:javascript
运行
复制
(2.4ms)  COMMIT
(0.2ms)  BEGIN
(0.2ms)  COMMIT

这看起来很奇怪(没有实际的更新查询,而在开发中我可以看到log_in_count等被递增)。但这是另一个表明出了问题的唯一迹象。在此之后,它将无法通过authenticate_user!检查并重定向回sign_in_url。

这让我抓狂--这是一个bug,还是有解决这个问题的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-01 10:52:31

我终于能够解决这个问题了,但我仍然不明白哪里出了问题。基本上,创建了一个“空的”Rails5项目,并使用omniauth-facebook gem和我的主应用程序的设置-部署到临时服务器的克隆实例上,设置了一个全新的设备,并且成功了!大部分代码是相同的;但当我用新应用程序中的devise.rb初始化器替换时,旧代码再次在stagingg服务器上工作。有趣的是,我把Omniauth的配置从旧的配置到新的应用,所以一定是Devise的另一个modules...and出了问题,而不是Omniauth本身。

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

票数 0
EN

Stack Overflow用户

发布于 2019-07-08 03:43:11

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42240872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档