【问题标题】:Devise in Rails doesn't work with HTTPs在 Rails 中设计不适用于 HTTPs
【发布时间】:2017-08-31 01:47:59
【问题描述】:

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

ActionController::InvalidAuthenticityToken in Devise::SessionsController#create

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

如果我按下按钮在http://myapp.com/users/sign_in 上登录,用户登录并且应用程序似乎运行顺利,除了用户也不能在 HTTPs 下创建帖子。

我想让设计验证在 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. 我的头上有&lt;%= csrf_meta_tags %&gt;
  2. 我清除了浏览器中的 cookie
  3. 我在 app/controllers/application_controller.rb 中尝试了 protect_from_forgery with: :null_session 而不是 protect_from_forgery with: :exception
  4. 我尝试将 &lt;%= hidden_field_tag :authenticity_token, form_authenticity_token %&gt; 放入 form_for 以进行新会话
  5. 我在根目录下尝试了devise_for :users, :controllers =&gt; { :sessions =&gt; "users/sessions" }
  6. 我尝试添加

    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 中

【问题讨论】:

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


【解决方案1】:

在 session_controller 中放一行

skip_before_action :verify_authenticity_token

在 routes.rb 中

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

因为它在用户登录时不需要 authentication_token

【讨论】:

  • Mayur,sessions_controller 在哪里?
  • 我会尝试在 controllers/users/sessions 文件夹中创建一个 sessions_controller.rb
  • Error: uninitialized constant Users::SessionsController 看来我需要你更多的解释。
  • sessions_controller 由自己设计 app/controllers/users/sessios_controller.rb 生成
【解决方案2】:

有在应用控制器中为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多