按下按钮后,按下"登录"在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
<%= csrf_meta_tags %>
protect_from_forgery with: :null_session
而不是protect_from_forgery with: :exception
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
放入新会话的form_for
devise_for :users, :controllers => { :sessions => "users/sessions" }
我尝试添加
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
答案 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