【发布时间】:2011-09-07 07:59:29
【问题描述】:
我需要从浏览器外部发出 HTTP POST 请求,但 Rails 后端不接受身份验证(错误 401)。我知道在这种情况下我需要传递一个 CSRF 令牌,但它不起作用。
当我通过浏览器上的表单发出请求时,它按预期工作,但是当我尝试从浏览器外部(例如使用 curl)模拟相同的请求(在标头和 cookie 方面)时,身份验证不起作用。
两个小改动让我在没有浏览器的情况下成功:(1) 关闭 protect_from_forgery,它验证 CSRF 或 (2) 使用 GET 而不是 POST 请求。在这两种情况下,传递 cookie 就足够了。这意味着问题肯定与 CSRF 相关。
所以,我的问题是:如何在不使用浏览器的情况下将受 CSRF 保护的 HTTP POST 发送到 Rails 服务器?
为了澄清,该过程分为三个步骤:
登录:返回一个cookie来识别会话;
新:
GET请求,返回 CSRF 令牌以供稍后使用(使用 cookie);创建:
POST请求,提交我想要创建的信息(使用会话 cookie 和 CSRF 令牌)。
唯一失败的是第三步。
【问题讨论】:
-
如果您有其他形式的身份验证,例如 API 密钥,那么您可以在控制器上使用 skip_before_filter :verify_authenticity_token。仅当您有适当的身份验证方法或使用来自外部服务的网络挂钩时才使用此选项。
标签: ruby-on-rails http http-post csrf protect-from-forgery