Omniauth 身份 InvalidAuthenticityToken

Dra*_*cir 4 ruby-on-rails omniauth

我遵循了关于如何实现 Omniauth-identity 的Railcasts教程,但遇到了障碍。

当我尝试注册用户时,出现以下错误

ActionController::InvalidAuthenticityToken in SessionsController#create 
Run Code Online (Sandbox Code Playgroud)

在控制台日志中弹出以下错误

Processing by SessionsController#create as HTML
  Parameters: {"name"=>"asdasd asdasd", "email"=>"asd@yopmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "provider"=>"identity"}
Can't verify CSRF token authenticity
Run Code Online (Sandbox Code Playgroud)

用户被毫无问题地插入到身份模型中,但是当应用程序尝试创建会话时,一切都是徒劳的。

这是我正在使用的相关代码

宝石文件

开放身份验证

gem 'bcrypt-ruby', '~> 3.1.2'

gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'
gem 'omniauth-identity'
Run Code Online (Sandbox Code Playgroud)

初始化程序/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET']
    provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
    provider :google_oauth2, ENV['GOOGLE_KEY'], ENV['GOOGLE_SECRET']
    provider :identity
end
Run Code Online (Sandbox Code Playgroud)

路线

  get 'auth/:provider/callback', to: 'sessions#create'
  post 'auth/:provider/callback', to: 'sessions#create'
  get 'auth/failure', to: redirect('/')
  get 'signout', to: 'sessions#destroy', as: 'signout'
Run Code Online (Sandbox Code Playgroud)

会话控制器

def create
    user = User.from_omniauth(env['omniauth.auth'])
    session[:user_id] = user.id
    redirect_to root_url, notice: "Signed In!"
end
Run Code Online (Sandbox Code Playgroud)

用户模型

def self.from_omniauth(auth)
    find_by_provider_and_uid(auth["provider"], auth["uid"]) || create_with_omniauth(auth)
end
Run Code Online (Sandbox Code Playgroud)

Зел*_*ный 5

InvalidAuthenticityTokenRails 检查令牌时引发的错误CSRF,您可以CSRF通过跳过验证来禁用控制器上的保护skip_before_action,添加到您的顶部SessionsController:

skip_before_action :verify_authenticity_token, only: :create
Run Code Online (Sandbox Code Playgroud)

但您必须小心并阅读有关CSRF保护的所有内容。