Rails 中的真实性令牌无效

dfa*_*ken 6 authentication ruby-on-rails

尝试使用 Devise 登录用户时,我收到无效的真实性令牌错误。

\n\n

我的布局中有,并且请求参数中csrf_meta_tags有一个存在。authenticity_token正如其他问题的答案中所建议的,protect_from_forgery with: :exception是 before before_action :authenticate_user!

\n\n

如果我注释掉protect_from_forgery,我会在服务器日志中看到以下内容:

\n\n
Started POST "/users/sign_in" for 127.0.0.1 at 2018-01-19 16:13:46 -0500\nProcessing by Devise::SessionsController#create as HTML\n    Parameters: {"utf8"=>"\xe2\x9c\x93", "authenticity_token"=>"[TOKEN]", "user"=>{"badge_number"=>"0285", "password"=>"[FILTERED]"}, "commit"=>"Log in"}\n    User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`badge_number` = \'0285\' ORDER BY `users`.`id` ASC LIMIT 1\n     (0.2ms)  SELECT `divisions`.`id` FROM `divisions` INNER JOIN `divisions_users` ON `divisions`.`id` = `divisions_users`.`division_id` WHERE `divisions_users`.`user_id` = 2\n    CACHE  (0.0ms)  SELECT `divisions`.`id` FROM `divisions` INNER JOIN `divisions_users` ON `divisions`.`id` = `divisions_users`.`division_id` WHERE `divisions_users`.`user_id` = 2  [["user_id", 2]]\nRedirected to http://localhost:3000/\nCompleted 302 Found in 141ms (ActiveRecord: 2.1ms)\n\n\nStarted GET "/" for 127.0.0.1 at 2018-01-19 16:13:46 -0500\nProcessing by IncidentsController#index as HTML\nCompleted 401 Unauthorized in 0ms (ActiveRecord: 0.0ms)\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,看起来登录正常工作,但重定向到请求的路径 ( /) 会导致 401 并被重定向到登录页面,就好像登录不起作用一样。

\n\n

然而,这些都不能真正解释为什么我首先会收到真实性令牌错误。

\n\n

鉴于据我所知 CSRF 令牌验证所需的所有元素均已到位,不确定调查该问题的下一步是什么。

\n

dfa*_*ken 4

我通过清除 localhost 的 cookie 解决了这个问题。

我通过 localhost 端口使用 SSH 隧道来访问生产站点,因此基于冲突会话的 cookiesecret_key_base位于 localhost 域中。

我通过在 cookie 名称前添加 Rails 环境来防止这种情况再次发生:

Rails.application.config.session_store :cookie_store, key: "_incidents_#{Rails.env}_session"
Run Code Online (Sandbox Code Playgroud)

因此,尽管使用 localhost 访问我的开发和生产环境,但由于处于不同的环境中,它们会写入不同的 cookie。