Rails用户登录错误:无法验证CSRF令牌的真实性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails用户登录错误:无法验证CSRF令牌的真实性相关的知识,希望对你有一定的参考价值。
我在用户登录生产环境中的rails应用程序时遇到问题。每当用户尝试登录时,都会收到以下错误消息:
Application Controller:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
end
选中后,我在production.log文件中发现了与CSRF相关的错误消息。生产环境(独角兽)面临此问题,并且在开发环境(rails -s)中不存在。
布局模板:
<html>
<head>
<title>My Site</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
W, [2018-09-21T13:55:13.032519 #20667] WARN -- : [c1cb8958-e963-43ba-8bdd-d5f38eb3394f] Can't verify CSRF token authenticity.
F, [2018-09-21T13:55:13.033892 #20667] FATAL -- : [c1cb8958-e963-43ba-8bdd-d5f38eb3394f]
F, [2018-09-21T13:55:13.034023 #20667] FATAL -- : [c1cb8958-e963-43ba-8bdd-d5f38eb3394f] ActionController::InvalidAuthenticityToken (ActionControl
ler::InvalidAuthenticityToken):
F, [2018-09-21T13:55:13.034040 #20667] FATAL -- : [c1cb8958-e963-43ba-8bdd-d5f38eb3394f]
F, [2018-09-21T13:55:13.034063 #20667] FATAL -- : [c1cb8958-e963-43ba-8bdd-d5f38eb3394f] actionpack (5.0.7) lib/action_controller/metal/request_fo
rgery_protection.rb:195:in `handle_unverified_request'
[c1cb8958-e963-43ba-8bdd-d5f38eb3394f] actionpack (5.0.7) lib/action_controller/metal/request_forgery_protection.rb:223:in `handle_unverified_requ
est'
[c1cb8958-e963-43ba-8bdd-d5f38eb3394f] devise (4.5.0) lib/devise/controllers/helpers.rb:255:in `handle_unverified_request'
[c1cb8958-e963-43ba-8bdd-d5f38eb3394f] actionpack (5.0.7) lib/action_controller/metal/request_forgery_protection.rb:218:in `verify_authenticity_to
ken'
知道可能是什么根本原因?
检查secret_key_base
中configsecrets.yml
的存在。
检查您是否在生产中设置了ENV["SECRET_KEY_BASE"]
($SECRET_KEY_BASE
)。
#csrf_meta_tags依靠secret_key_base
来验证令牌。
检查您是否已打开asset fingerprinting,并且在发布后您没有缓存旧页面。
检查config.assets.digest = true
的生产。
指纹识别行为由config.assets.digest初始化选项控制(对于生产,默认为true,对于其他所有选项,默认为false)。
它可能缺失,所以依赖于默认值,所以检查$RAILS_ENV = production
。
可能不完全是您遇到的问题,因为您的protect_from_forgery
位于ApplicationController的顶部,但可能对其他人有帮助:
我在devise_parameter_sanitizer
线以上的if: devise_controller?
之前跟注了protect_from_forgery
,这导致Devise在铁路升级到5.2之后突破。由于Rails 5.2默认情况下会执行protect_from_forgery
(如果您使用默认的5.2设置),我可以在设置config.load_defaults 5.2
后删除此行。
以上是关于Rails用户登录错误:无法验证CSRF令牌的真实性的主要内容,如果未能解决你的问题,请参考以下文章