Ruby &引用;“检测到CSRF”;使用Omniauth和Google

Ruby &引用;“检测到CSRF”;使用Omniauth和Google,ruby,oauth-2.0,sinatra,omniauth,Ruby,Oauth 2.0,Sinatra,Omniauth,我明白了 OmniAuth::Strategies::OAuth2::CallbackError位于/auth/google/callback 检测到csrf|u |检测到csrf 我的代码: require 'sinatra' require "sinatra/json" require "sinatra/config_file" require 'omniauth-oauth2' require 'omniauth-google-oauth2' use Rack::Logger conf

我明白了

OmniAuth::Strategies::OAuth2::CallbackError位于/auth/google/callback 检测到csrf|u |检测到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
需要“sinatra”
需要“sinatra/json”
需要“sinatra/config_文件”
需要“omniauth-oauth2”
需要“omniauth-google-oauth2”
使用Rack::Logger
配置文件“config/app\u config.yml”
使用Rack::Session::Cookie,机密:“5fb7w345y3489f523y4h”
配置do
启用:会话
结束
使用OmniAuth::Builder do
提供者:google_oauth2,settings.google[:client_id],settings.google[:secret],
{
:scope=>“userinfo.profile”,
:access_type=>“脱机”,
:prompt=>“选择账户许可”,
:name=>“谷歌”
}
结束
获取“/list”do
json获取列表
结束
获取“/”do
%Q||
结束
获取“/auth/:name/callback”do
@auth=request.env['omniauth.auth']
@授权检查
结束
我的回调同时返回代码和状态。

遇到同样的问题

(google_oauth2)回调阶段已启动。
(google_oauth2) 身份验证失败!检测到csrf_: OmniAuth::Strategies::OAuth2::回调错误,检测到csrf|csrf 察觉

上次Omniauth-oauth2更新引入了“state”参数,该参数有一个必填字段

有些人建议使用provider_忽略_state:对,但这是个坏主意,因为它引入了csrf缺陷

我想我们必须降级到以前的版本才能让google_oauth2正常工作


当在
/config/initializer/session\u store.rb
中定义的域与在google api控制台中定义的源/重定向\u uri不同时,rails会出现此问题

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

删除域参数或在两侧使用相同的域修复了该问题。

如果您将Deviate与OmniAuth一起使用,则需要跳过额外的OmniAuth.rb初始值设定项文件,只需在初始值设定项/Deviate.rb中添加config.provider“KEY”、“SECRET”,然后继续执行。

这为我解决了问题,不是其他东西——我已经在会话存储config.Fixed中为我们修复了domain::all…之所以修复它,是因为如果您在两个位置都有代码,它会从omniauth gem中触发此代码两次,第二次,omniauth.state为nil,因为它在第一次迭代中被删除。埃尔西夫!options.provider_忽略_state&(request.params[“state”]。to_.empty?| | request.params[“state”!=session.delete(“omniauth.state”))失败!(:csrf_detected,CallbackError.new(:csrf_detected,“csrf detected”))一个网站这样对我。作为一个用户,我是否有一个变通的方法?那么,是什么样的verison使这一方法有效呢?根据GitHub repo
的建议,还将“provider\u ignores\u state:true”设置为where?,provider\u ignores\u state
仅适用于AJAX流。还要检查浏览器中是否启用了cookie,修复了CSRF检测到的错误,my/config/initializer/session_store.rb
Rails.application.config.session_store:cookie_store,key:“\u XXX-XXXXX_session”
我刚刚重新启动了服务器,一切都很好:P