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

时间:2018-09-21 13:44:10

标签: ruby-on-rails devise csrf

用户在生产环境中登录我的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'

任何想法可能是根本原因吗?

2 个答案:

答案 0 :(得分:0)

检查secret_key_base中是否存在config\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

答案 1 :(得分:0)

由于您的def print_sequence(n, term): if n==0: return elif n==1: print(term(n)) else: 位于ApplicationController的顶部,可能并不是您所遇到的问题,但这可能对其他人有帮助:

我在protect_from_forgery上方的行devise_parameter_sanitizer之前的if: devise_controller?通话中打电话给protect_from_forgery,这导致Devise在Rails升级到5.2。由于Rails 5.2在默认情况下会protect_from_forgery(如果您使用默认的5.2设置),因此我能够在设置config.load_defaults 5.2后删除此行。