2014-03-13 62 views
9

我得到這個「CSRF檢測」 與Omniauth和谷歌

OmniAuth ::策略:: OAuth2用戶:: 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 

我的回調返回代碼和狀態。

+0

得到了同樣的問題 – gdurelle

+0

我剛剛重新啓動服務器,每一件事情都非常好:P – ImranNaqvi

回答

8

得到了同樣的問題

(google_oauth2)回調階段開始。
(google_oauth2) 驗證失敗! csrf_detected: OmniAuth ::策略:: OAuth2 :: CallbackError,csrf_detected | CSRF 檢測到

最後一個Omniauth-oauth2更新引入了「狀態」參數有一個必填字段。

有人建議使用provider_ignores_state:真實的,但因爲它引入了CSRF漏洞

想我們會降級到以前的版本,以保持google_oauth2工作這是一個壞主意。

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

+0

有關於此的任何更新?或修復 –

+1

一個網站做到了這一點給我。作爲用戶,我有沒有解決方法? –

+0

那麼,這個工作是什麼呢?還設置「provider_ignores_state:true」在哪裏? – Dave

7

此問題發生與導軌當/config/initializer/session_store.rb定義的域是從谷歌API控制檯定義的原點/ REDIRECT_URI不同。

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

刪除域參數或在兩邊使用相同的域修復了問題。

+1

另請檢查瀏覽器中是否啓用了cookies,修復了我檢測到的CSRF錯誤,我的/config/initializer/session_store.rb 'Rails.application.config.session_store:cookie_store,key:'_XXX-XXXXX_session'' – Conor

7

如果您在OmniAuth中使用Devise,您需要跳過額外的omniauth.rb初始化文件,並在您的初始化程序/ devise.rb中添加config.provider「KEY」,「SECRET」,然後繼續執行。

+1

This解決了我的問題,而不是其他的東西 - 我已經有了域::所有在會話存儲配置。 –

+0

對我們來說也是固定的......這個修復它的原因是因爲如果你在兩個位置都有代碼,它會從omniauth gem中兩次激發這段代碼,第二次,omniauth.state是零,因爲它被刪除了在第一次迭代中。 elsif!options.provider_ignores_state &&(request.params [「state」]。to_s.empty?|| request.params [「state」]!= session.delete(「omniauth.state」)) fail!(: csrf_detected,CallbackError.new(:csrf_detected,「檢測到CSRF」)) – parameter