3

我需要POST从浏览器外部发出 HTTP 请求,但 Rails 后端不接受身份验证(错误 401)。我知道在这种情况下我需要传递一个 CSRF 令牌,但它不起作用。

当我通过浏览器上的表单发出请求时,它按预期工作,但是当我尝试从浏览器外部(例如使用 curl)模拟相同的请求(在标头和 cookie 方面)时,身份验证不会不工作。

两个小的改变让我在没有浏览器的情况下成功:(1)关闭protect_from_forgery,它验证 CSRF 或(2)使用GET而不是POST请求。在这两种情况下,传递 cookie 就足够了。这意味着问题肯定与 CSRF 相关。

所以,我的问题是:如何在POST不使用浏览器的情况下将受 CSRF 保护的 HTTP 发送到 Rails 服务器?

为了澄清,该过程分为三个步骤:

  1. Login:返回一个cookie来标识会话;

  2. :一个GET返回 CSRF 令牌以供以后使用的请求(使用 cookie);

  3. 创建POST提交我要创建的信息的请求(使用会话 cookie 和 CSRF 令牌)。

唯一失败的是第三步。

4

1 回答 1

2

假设您的 CSRF 令牌是基于 cookie 的,那么您用来发出请求的程序需要跟踪 cookie。查看--cookie-jarcurl 中的选项。

于 2011-06-02T19:18:04.023 回答