用户在生产环境中登录我的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'
任何想法可能是根本原因吗?
答案 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
后删除此行。