Rails + omniauth + facebook - 检测到csrf

时间:2012-08-15 14:16:58

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

我正在通过现有的facebook帐户登录网站。所以我注册了一个facebook应用程序并在development.rbproduction.rb文件中存储了 api secret 。然后我使用omniauth-facebook gem + devise gem来实现此功能。它完美无缺。

顺便说一句,用户可以通过内部认证(通过设计)或通过usig facebook帐户登录。

但是有一个奇怪的问题。如果我登录到facebook帐户,我注册了一个应用程序,它完美

所以我注册了另一个没有在我的Rails应用程序中使用的应用程序的facebook帐户并尝试登录。它导致错误“发生了错误。请稍后再试。” ... “无法通过Facebook帐户验证您,因为”Csrf检测到“”

我尝试使用1.4.0 omniauth-facebook gem而不是1.4.1但它也导致错误“must pass either a代码parameter or a signed request (via signed_request parameter or a fbsr_XXX cookie)

宝石

oauth2 (0.8.0) 
omniauth (1.1.0) 
omniauth-oauth2 (1.1.0) 
omniauth-facebook (1.4.1) 
warden (1.2.1)
devise (2.1.2)

你的想法?

3 个答案:

答案 0 :(得分:8)

我也有这个问题,结果我仍然在我的Facebook应用程序中启用了“沙盒”模式。听起来这也可能是你的问题:)

如果没有,请您发布任何相关的日志条目吗?

答案 1 :(得分:2)

对我来说,我需要将provider_ignores_state: true添加到我的Omniauth配置中:

config.omniauth :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET'], {
  strategy_class: OmniAuth::Strategies::Facebook,
  provider_ignores_state: true
}

这是omniauth-facebook gem版本1.6.0。

https://github.com/mkdynamic/omniauth-facebook/issues/73

还有更多信息

答案 2 :(得分:0)

当我删除' omniauth.rb'我解决了这个问题。因为我在devise.rb中已经有了这个配置:

  config.omniauth :facebook, ENV["FB_ID"], ENV["FB_SECRET"],
    scope: 'email',
    info_fields: 'email, first_name, last_name',
    image_size: 'large',  # 50x50, guaranteed ratio
    secure_image_url: true

请记住重新启动服务器以进行测试。