【问题标题】:Devise authentication fails on first attempt, succeeds afterwards设计验证第一次尝试失败,之后成功
【发布时间】:2013-01-07 01:17:20
【问题描述】:

我使用的是 Devise (2.1.2) 和 Rails (3.2.9),并且启用了基本身份验证(用于测试)。我正在使用 CURL 发布一个 JSON POST 请求,但我看到了奇怪的行为。我第一次发送请求时(服务器重启后)身份验证失败,但在第二次发送完全相同的请求后成功。

调试时,第一次尝试时,winning_strategies 似乎为零,但第二次尝试时填充了三个策略。

这种行为的原因是什么?

【问题讨论】:

  • winning_strategies 在用户认证中做了什么?
  • 我只是想调试它,winning_strategies 是 Warden 某处的一个列表,我不熟悉 Devise/Warden 的内部结构,所以这只是对知识渊博的人的提示。
  • 是否仅适用于使用 CURL 的 JSON POST 请求?可以通过浏览器登录吗?
  • 是的,浏览器登录正常。
  • 你解决了吗?

标签: ruby-on-rails devise


【解决方案1】:

试试:

验证:

curl -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -X POST http://localhost:3000/users/sign_in \
  -d "{'user' : { 'email' : 'test@example.com', 'password' : 'password'}}" \
  -c cookie

显示:

curl -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -X GET http://localhost:3000/pages/1.xml \
  -b cookie

对于post 请求-

对于 Rails 3 中的非 GET 请求,您需要一个 CSRF 令牌

这是因为 Rails 在默认情况下会向表单添加一个真实性令牌,以防止恶意伪造提交的参数。由于您没有在请求中提供此令牌,因此 rails 不接受它。你可以绕过这个

skip_before_filter :verify_authenticity_token

【讨论】:

  • 是的,我在日志中看到了有关 CSRF 令牌的消息,但这只是一个警告,似乎没有任何效果。正如我所说,完全相同的 POST 请求第一次失败,第二次工作(之后每次)。为什么?
  • 所以这是一个严重的警告,可能会为您退出第一次身份验证。第二次,它以某种方式获取前一个令牌,然后您获得身份验证。似乎又是一个authenticity_token 问题。尝试绕过。
  • “第二次,它以某种方式获得了前一个令牌......” - 如何?我也第二次收到警告。
  • 这只是一个猜测。在第一次和第二次之后我没有看到你的控制台,但是由于使用浏览器你可以登录,唯一的合法问题似乎是token,因为 json 是外部的,rails 服务器不能直接接受。尝试绕过它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2011-09-23
相关资源
最近更新 更多