“CSRF检测到”与Omniauth和Google合作

时间:2014-03-13 17:19:54

标签: ruby oauth-2.0 sinatra omniauth

我得到了这个

  

OmniAuth :: Strategies :: OAuth2 :: / auth / google / callback中的CallbackError   csrf_detected | CSRF检测到了

我的代码:

require 'sinatra'
require "sinatra/json"
require "sinatra/config_file"
require 'omniauth-oauth2'
require 'omniauth-google-oauth2'

use Rack::Logger

config_file "config/app_config.yml"
use Rack::Session::Cookie, secret: '5fb7w345y3489f523y4h'

configure do
  enable :sessions
end

use OmniAuth::Builder do
  provider :google_oauth2, settings.google[:client_id], settings.google[:secret],
    {
      :scope => "userinfo.profile",
      :access_type => "offline",
      :prompt => "select_account consent",
      :name => "google"
    }
end

get '/list' do
  json get_list
end

get '/' do
  %Q|<a href='/auth/google'>Sign in with Google</a>|
end

get '/auth/:name/callback' do
  @auth = request.env['omniauth.auth']
  @auth.inspect
end

我的回调是返回代码和状态。

4 个答案:

答案 0 :(得分:9)

遇到同样的问题

  

(google_oauth2)已启动回拨阶段   (google_oauth2)   验证失败! csrf_detected:   OmniAuth :: Strategies :: OAuth2 :: CallbackError,csrf_detected | CSRF   检测

最后一次Omniauth-oauth2更新介绍了&#34;状态&#34; param有一个必填字段。

有人建议使用provider_ignores_state:true,但这是一个坏主意,因为它引入了csrf漏洞

猜猜我们必须降级到以前的版本才能让google_oauth2保持正常运作。

https://github.com/intridea/omniauth-oauth2/issues/58

上发布

答案 1 :(得分:8)

/config/initializer/session_store.rb中定义的域与google api控制台中定义的origin / redirect_uri不同时,rails会出现此问题。

MyApp::Application.config.session_store :cookie_store, key: '_app_session', domain: 'my_app.com'

删除域参数或双方使用相同的域修复了问题。

答案 2 :(得分:8)

如果你正在使用Devise和OmniAuth,你需要跳过额外的omniauth.rb初始化文件,只需添加config.provider&#34; KEY&#34;,&#34; SECRET&#34;在你的初始化程序/ devise.rb中,然后继续你的实现。

答案 3 :(得分:0)

您是否回击并重新尝试登录?我遇到了这个问题,这让我很困惑,但这是因为我要回去重试。如果我再次输入地址,就不会出现问题