轨道后路由中的"无效真实性令牌"错误



我有一个带有POST网址的rails应用程序,它可以创建一些资源。我有一个带有表单的页面,该表单接收所有信息,并在没有真实性令牌的情况下对 POST 网址进行 AJAX 调用。

在执行 AJAX 调用之前,正在执行data["authenticity_token"] = "";

服务器端记录的参数如下所示

{"utf8"=>"✓", "authenticity_token"=>"", "company_customer"=>{"name"=>"Anand"}}

创建资源没有任何错误(我的ApplicationController中有protect_from_forgery with: :exception(。

但是当我尝试从邮递员调用相同的 POST 网址时,我收到InvalidAuthenticityToken错误。

  1. 为什么我会收到错误?
  2. 在第一种情况下,rails 应用程序如何验证 POST 请求的真实性?

在第一步中,即从浏览器,您可能在cookie中有一些会话ID,但在这里没有。

此外,如果您点击remote:true选项,它将从隐藏字段中的页面中获取真实性令牌。

有关更多详细信息,请在这两种情况下检查您的日志。

当您使用帮助程序方法生成表单时form_for此令牌会自动作为隐藏字段添加到其中,因此 Rails 确保请求来自您的表单之一。

当邮递员或任何其他应用程序请求时,您应该取消保护控制器操作,请参阅此处的操作方法:https://stackoverflow.com/a/22715175/8352929

你可以从这里找到CSRF是如何工作的。我建议你通过它。

每当使用form_forRails 都会向表单添加一个隐藏的输入字段,如下所示:

<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 参数中,则请求将成功完成。

最新更新