Ruby &引用;“检测到CSRF”;使用Omniauth和Google
我明白了 OmniAuth::Strategies::OAuth2::CallbackError位于/auth/google/callback 检测到csrf|u |检测到csrf 我的代码: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
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.rbRails.application.config.session_store:cookie_store,key:“\u XXX-XXXXX_session”
我刚刚重新启动了服务器,一切都很好:P