Rails中的设计并不适用于HTTP

时间:2017-04-05 12:32:33

标签: ruby-on-rails ruby ssl https devise

按下按钮后,按下"登录"在https://myapp.com/users/sign_in上,出现以下错误:

ActionController::InvalidAuthenticityToken in Devise::SessionsController#create

无论现有用户的凭据如何。

如果我按下按钮登录http://myapp.com/users/sign_in,则用户登录并且应用程序似乎运行顺畅,但用户无法在HTTP下创建帖子。

我想在SSL下进行设计认证工作。

routes.rb中:

devise_for :users

application_controller.rb:

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
end

user.rb:

class User < ApplicationRecord
    devise :database_authenticatable, :recoverable, :rememberable, :registerable, :trackable, :validatable
end
  1. 我头上有<%= csrf_meta_tags %>
  2. 我在浏览器中清除了Cookie
  3. 我在app / controllers / application_controller.rb中尝试了protect_from_forgery with: :null_session而不是protect_from_forgery with: :exception
  4. 我尝试将<%= hidden_field_tag :authenticity_token, form_authenticity_token %>放入新会话的form_for
  5. 我在root
  6. 中尝试了devise_for :users, :controllers => { :sessions => "users/sessions" }
  7. 我尝试添加

    config.to_prepare { Devise::SessionsController.force_ssl }
    config.to_prepare { Devise::RegistrationsController.force_ssl }
    config.to_prepare { Devise::PasswordsController.force_ssl }
    

    在config / environments / production.rb

2 个答案:

答案 0 :(得分:0)

在sessions_controller中添加一行

skip_before_action :verify_authenticity_token

和routes.rb

devise_for :users, controllers:
                  {
                    sessions: 'users/sessions',
                  }

因为用户登录时不需要authentication_token

答案 1 :(得分:0)

解决方法是为应用程序控制器中的sign_in操作禁用CSRF保护

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  ....
end

将其设为:

class ApplicationController < ActionController::Base
  protect_from_forgery  with: :exception
  skip_before_filter :verify_authenticity_token, if: -> { controller_name == 'sessions' && action_name == 'create' }
  ...
end