Rails用户登录错误:无法验证CSRF令牌的真实性

问题描述 投票:1回答:2

我在用户登录生产环境中的rails应用程序时遇到问题。每当用户尝试登录时,都会收到以下错误消息:

enter image description here虽然相同的应用程序控制器:

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'

知道可能是什么根本原因?

ruby-on-rails devise csrf
2个回答
0
投票

检查secret_key_baseconfig\secrets.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


0
投票

可能不完全是您遇到的问题,因为您的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后删除此行。

© www.soinside.com 2019 - 2024. All rights reserved.