使用AWS JS SDK时,请求标头不包含HTTP_X_CSRF_TOKEN

Ahm*_*eat 11 javascript ajax ruby-on-rails amazon-web-services aws-sdk

我有一个Rails应用程序,我可以通过ajax发布问题的答案,它工作正常,但是,我添加了aws-js-sdk脚本,以便能够从浏览器上传我的答案中的图像,图像将上传到s3,发送回来在回调中新上传的图像的url,然后我保存答案.

我把这个库包括在内:

 <%= javascript_include_tag "//sdk.amazonaws.com/js/aws-sdk-2.1.12.min.js" %>
Run Code Online (Sandbox Code Playgroud)

预期的行为:当我使用图像提交答案时,请求标题应包含HTTP_X_CSRF_TOKEN以验证表单是否在我的网站内提交.

问题:请求标头不包含HTTP_X_CSRF_TOKEN,这导致错误ActionController::InvalidAuthenticityToken

Chl*_*loe 2

标头中未设置真实性令牌。它被设置为表单标签中的隐藏字段,如下所示:

\n\n
<form class="edit_user" id="edit_user_6" action="/users/6/set_facilitator" accept-charset="UTF-8" data-remote="true" method="post">\n  <input name="utf8" type="hidden" value="\xe2\x9c\x93">\n  <input type="hidden" name="_method" value="patch">\n  <input type="hidden" name="authenticity_token" value="yrr7gWaLmE8ul4s0JcNmAU6H0YB+c7YR/8yCE7it+cRlG9lfdejTSFT7bhydWEQPSqv2E7gVPQ++9mvfJDfJeA==">\n  <select class="form-control" data-submit="true" name="user[facilitator_id]" id="user_facilitator_id">\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您通过 AJAX 提交表单时,authenticity_token也会作为参数提交。

\n\n
  Parameters: {"utf8"=>"\xe2\x88\x9a", "authenticity_token"=>"vcvY+cRQC0oM99l5+BFHu6GShPAedugTP1jRqXCxRa3bVGFLjLSVbMFk78aR5N0ol1WOu1noAo/GF6B67PSk6Q==", ...}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不知道 S3 gem 是如何工作的,但如果它直接提交给 Amazon,那么它不会使用真实性令牌。Amazon 无法知道服务器上 Rails 应用程序的密钥。向我们展示生成的 HTML 代码,以查看 S3 gem 是否创建了主表单之外的单独表单,或者是否尝试将 a 嵌入<form>到另一个<form>无效的 HTML 中。

\n\n

如果需要,您可以使用以下行关闭控制器中的令牌检查:

\n\n
protect_from_forgery :except => :action_method\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅此处的文档:http ://guides.rubyonrails.org/v5.0/working_with_javascript_in_rails.html#form-for和此处http://guides.rubyonrails.org/v5.0/security.html#csrf-countermeasures

\n