DEVISE用户sign_in给出了CSRF代币真实性标记的身份验证错误

问题描述 投票:0回答:5
IAM使用

devise

(最新版本-3.2.0)与
rails
(最新版本-4.0.1)
我正在做简单的身份验证(无ajax或api),并遇到CSRF真实性令牌的错误。检查下面的帖子请求

started POST "/users/sign_in" for 127.0.0.1 at 2013-11-08 19:48:49 +0530 Processing by Devise::SessionsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"SJnGhXXUXjncnPhCdg3muV2GYCA8CX2LVFV78pqddD4=", "user"=> {"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"} Can't verify CSRF token authenticity User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1 (0.1ms) begin transaction SQL (0.4ms) UPDATE "users" SET "last_sign_in_at" = ?, "current_sign_in_at" = ?, "sign_in_count" = ?, "updated_at" = ? WHERE "users"."id" = 2 [["last_sign_in_at", Fri, 08 Nov 2013 14:13:56 UTC +00:00], ["current_sign_in_at", Fri, 08 Nov 2013 14:18:49 UTC +00:00], ["sign_in_count", 3], ["updated_at", Fri, 08 Nov 2013 14:18:49 UTC +00:00]] (143.6ms) commit transaction Redirected to http://localhost:3000/ Completed 302 Found in 239ms (ActiveRecord: 144.5ms | Search: 0.0ms)

根URL指向
home#new

,就像

class HomeController < ApplicationController
   before_action :authenticate_user!
   def index
   end
end

SIGN_IN页面生成的HTML视图就像:

    META标签
  • <meta content="authenticity_token" name="csrf-param" /> <meta content="aV+d7Z55XBJF2VtyL8V3zupR3OwhaQ6UHNtlQLBQf5Y=" name="csrf-token" />

    form
  • <form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"> <div style="margin:0;padding:0;display:inline"> <input name="utf8" type="hidden" value="&#x2713;" /> <input name="authenticity_token" type="hidden value="aV+d7Z55XBJF2VtyL8V3zupR3OwhaQ6UHNtlQLBQf5Y=" /> </div> <div><label for="user_email">Email</label><br /> <input autofocus="autofocus" id="user_email" name="user[email]" type="email" value="" /> </div> <div><label for="user_password">Password</label><br /> <input id="user_password" name="user[password]" type="password" /></div> <div><input name="user[remember_me]" type="hidden" value="0" /> <input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" /> <label for="user_remember_me">Remember me</label></div> <div><input name="commit" type="submit" value="Sign in" /></div> </form>

    身份验证请求甚至更新了
  • last_sign_in_at

sign_in_count

值,但是当我尝试在控制器中访问
current_user
时,它是
nil
.
。 对我来说,它实际上并没有在
user
中签名。但是问题是“为什么它在

last_sign_in_at

表中更新

sign_in_count
/
user
值?”
    
当CSRF令牌不正确时,Rails将不会读取或对会话进行任何更新。它仍然会执行控制器指定的任何其他操作,这说明了为什么您会看到DB更新但最终不会登录。

i请注意,您的日志和页面中的authenticity_token不匹配。我意识到这可能是因为您捕获了一个不同的请求,但是您应该检查页面上的一个请求是否与日志中的一个请求匹配。我还假设您在视图中使用了适当的标签,该标签每次都会生成不同的authenticity_token,而不仅仅是对HTML输入进行硬编码。
ruby-on-rails ruby-on-rails-4 devise csrf rails-api
5个回答
14
投票

protect_from_forgery except: :sign_in

CSRF攻击您在行动中的攻击的几率似乎很遥远(

,如果只是设计,那么我建议您向他们提出问题,

您已经完成了

<-pun) to me.

在应用程序控制器上添加了此功能(这在Rails 5上工作)

protect_from_forgery unless: -> { request.format.json? }

将其添加到设计会sessioncontroller

5
投票
skip_before_action :verify_authenticity_token, only: [:create]

用卷曲
curl -X POST -v -H 'Content-Type: application/json' http://0.0.0.0:3000/users/sign_in -d '{"user" : {"email": "[email protected]", "password": "secret" }}'

设计宝石没有问题。我删除了“ rails-api”宝石,我的应用开始工作。
    

i修复了相同的问题,只需删除“远程:true”选项:更改form_for(型号,远程:true)form_for(型号)

2
投票

我只是删除


1
投票

但显然这只是临时解决方案。


0
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.