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!。
如果我注释掉protect_from_forgery,我会在服务器日志中看到以下内容:
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)\nRun Code Online (Sandbox Code Playgroud)\n\n因此,看起来登录正常工作,但重定向到请求的路径 ( /) 会导致 401 并被重定向到登录页面,就好像登录不起作用一样。
然而,这些都不能真正解释为什么我首先会收到真实性令牌错误。
\n\n鉴于据我所知 CSRF 令牌验证所需的所有元素均已到位,不确定调查该问题的下一步是什么。
\n我通过清除 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。
| 归档时间: |
|
| 查看次数: |
3493 次 |
| 最近记录: |