2011-06-02 102 views
3

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

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

两个小变化让我成功没有浏览器:(1)关闭protect_from_forgery,其验证CSRF或(2)使用GET代替POST的请求。在这两种情况下,传递cookie都足够了。这意味着问题肯定与CSRF的东西有关。

所以,我的问题是:如何在不使用浏览器的情况下为Rails服务器制作受CSRF保护的HTTP POST

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

  1. 登录:返回一个cookie来识别所述会话;

  2. :a GET请求返回稍后使用的CSRF令牌(使用cookie);

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

失败的唯一步骤就是第三步。

+0

如果您有其他形式的认证,例如API密钥,那么您可以在您的控制器上使用** skip_before_filter:verify_authenticity_token **。只有在您使用了身份验证方法或您正在使用来自外部服务的Web钩子时才使用此功能。 – Gazler 2011-06-02 19:18:58

回答

2

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

+0

谢谢你,@tylerl!我正在使用第三步中由步骤1返回的cookie。保持步骤2返回的cookie并在步骤3中使用它解决了我的问题!在第二个cookie的内容中没有提到CSRF,但似乎自会话改变以后,应该使用正确的一个。 – 2011-06-02 19:34:17