我有一个带有POST网址的rails应用程序,它可以创建一些资源。我有一个带有表单的页面,该表单接收所有信息,并在没有真实性令牌的情况下对 POST 网址进行 AJAX 调用。
在执行 AJAX 调用之前,正在执行data["authenticity_token"] = "";
。
服务器端记录的参数如下所示
{"utf8"=>"✓", "authenticity_token"=>"", "company_customer"=>{"name"=>"Anand"}}
创建资源没有任何错误(我的ApplicationController
中有protect_from_forgery with: :exception
(。
但是当我尝试从邮递员调用相同的 POST 网址时,我收到InvalidAuthenticityToken
错误。
- 为什么我会收到错误?
- 在第一种情况下,rails 应用程序如何验证 POST 请求的真实性?
在第一步中,即从浏览器,您可能在cookie中有一些会话ID,但在这里没有。
此外,如果您点击remote:true
选项,它将从隐藏字段中的页面中获取真实性令牌。
有关更多详细信息,请在这两种情况下检查您的日志。
当您使用帮助程序方法生成表单时form_for
此令牌会自动作为隐藏字段添加到其中,因此 Rails 确保请求来自您的表单之一。
当邮递员或任何其他应用程序请求时,您应该取消保护控制器操作,请参阅此处的操作方法:https://stackoverflow.com/a/22715175/8352929
你可以从这里找到CSRF是如何工作的。我建议你通过它。
每当使用form_for
Rails 都会向表单添加一个隐藏的输入字段,如下所示:
<input type="hidden" name="authenticity_token" value="doLYVxrkhdrzn7zzriHXjFE6ZhNCuXVxLrau4ouENmuKKC/SWp2NMM/MeL/Ji2tDvzNcJHVN/Hc0LIluL3o5QQ==" />
此外,Rails在网站的元标记中包含CSRF令牌,如下所示:
<meta name="csrf-token" content="zxnmBxg81JUQPG/C/wb3HRCah0m9Xe2A+gZ5N0Oy7cfwC+dF4hC325WxdVDLfkIxcw/CR/xyaC1phpvZ4EcgQw==" />
因此,当您使用 Railsform_for
或类似的东西进行 AJAX 调用(可能带有remote: true
(时,真实性令牌将发送到服务器。当您尝试与邮递员发送相同的请求时,它不存在。
如果您复制 CSRF 令牌并将其添加到 Postman 参数中,则请求将成功完成。