gpt4 book ai didi

ruby-on-rails - 设计用户sign_in给出CSRF token 真实性 token 的身份验证错误

转载 作者:行者123 更新时间:2023-12-03 12:54:40 26 4
gpt4 key购买 nike

我正在将devise(最新版本-3.2.0)与rails(最新版本-4.0.1)一起使用

我正在做简单的身份验证(没有ajax或api),并且CSRF身份验证 token 出现错误。检查下面的POST请求

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"=>"a@a.com", "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" =
'a@a.com' 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)

根网址指向 home#new,就像
class HomeController < ApplicationController
before_action :authenticate_user!
def index
end
end

Sign_in页面生成的html View 如下:
  • 元标记

    <meta content="authenticity_token" name="csrf-param" />
    <meta content="aV+d7Z55XBJF2VtyL8V3zupR3OwhaQ6UHNtlQLBQf5Y=" name="csrf-token" />
  • 形式

    <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_atsign_in_count值,但是当我尝试在 Controller 中访问 current_user时,它就是 nil

    据我说,它实际上不是在登录 user。但是接下来的问题是:“为什么要更新 last_sign_in_at表中的 sign_in_count / user值?”

    最佳答案

    如果CSRF token 不正确,Rails将不会读取 session 或对其进行任何更新。它将仍然执行 Controller 指定的任何其他操作,这说明了为什么您看到数据库更新但最终没有登录。

    我注意到您的日志和页面中的authenticity_token不匹配。我意识到这可能是因为您捕获了一个不同的请求,但是您应该检查页面上的请求是否与同一请求的日志中的请求相匹配。我还假设您在 View 中使用了正确的标记,该标记每次都会生成不同的authenticity_token,而不仅仅是硬编码HTML输入。

    您是否发现与设计无关的表格存在相同的问题?否则,作为解决方法,您可以在 Controller 中使用以下代码来将操作从CSRF检查中排除:

    protect_from_forgery except: :sign_in

    对我来说,CSRF攻击您登录行为的几率似乎很小(<-pun)。

    另外,如果只是出于设计目的,那么我建议您向他们提出问题 which you've already done

    关于ruby-on-rails - 设计用户sign_in给出CSRF token 真实性 token 的身份验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861402/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com