从浏览器外部向 Rails 服务器发出请求时出现 CSRF 令牌问题
我需要从浏览器外部发出 HTTP POST
请求,但 Rails 后端不接受身份验证(错误 401)。我知道在这种情况下我需要传递 CSRF 令牌,但它不起作用。
当我通过浏览器上的表单发出请求时,它会按预期工作,但是当我尝试从浏览器外部(例如使用curl)模拟相同的请求(在标头和cookie方面)时,身份验证不会不工作。
两个小更改让我在没有浏览器的情况下取得了成功:(1) 关闭用于验证 CSRF 的 protect_from_forgery
或 (2) 使用 GET
而不是 POST
> 对于请求。在这两种情况下,传递 cookie 就足够了。这意味着问题肯定与 CSRF 相关。
所以,我的问题是:如何在不使用浏览器的情况下向 Rails 服务器发送受 CSRF 保护的 HTTP POST
?
为了澄清起见,该过程分为三个步骤:
登录:返回一个 cookie 来标识会话;
新:一个
GET
请求,返回稍后使用的 CSRF 令牌(使用 cookie);创建:提交我想要创建的信息的
POST
请求(同时使用会话 cookie 和 CSRF 令牌)。
唯一失败的是第三步。
I need to make an HTTP POST
request from outside the browser, but the Rails back-end is not accepting the authentication (error 401). I know I need to pass a CSRF token in such cases, but it's not working.
When I make the request through a form on a browser, it works as expected, but when I try to simulate an identical request (in terms of headers and cookies) from outside the browser (using curl, for example), the authentication doesn't work.
Two small changes allowed me success without a browser: (1) turning off protect_from_forgery
, which validates the CSRF or (2) using GET
instead of POST
for the request. In both cases, passing the cookie is enough. That means the problem is definitely related to CSRF stuff.
So, my question is: how can I make a CSRF-protected HTTP POST
to a Rails server without using a browser?
To clarify, the process is broken in three steps:
Login: returns a cookie to identify the session;
New: a
GET
request that returns the CSRF token to be used later (uses the cookie);Create: a
POST
request that submits the information I want to create (uses both the session cookie and the CSRF token).
The only step which fails is the third one.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
假设您的 CSRF 令牌是基于 cookie 的,那么您用来发出请求的程序需要跟踪 cookie。查看curl 中的
--cookie-jar
选项。Assuming your CSRF token is cookie-based, then the program you use to make your requests needs to track cookies. Check out the
--cookie-jar
option in curl.