【问题标题】:Request header does not include HTTP_X_CSRF_TOKEN when using AWS JS SDK使用 AWS JS SDK 时请求标头不包含 HTTP_X_CSRF_TOKEN
【发布时间】:2017-01-13 00:10:37
【问题描述】:

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

我包含这样的库:

 <%= javascript_include_tag "//sdk.amazonaws.com/js/aws-sdk-2.1.12.min.js" %>

预期行为:当我提交带有图片的答案时,请求标头应包含 HTTP_X_CSRF_TOKEN 以验证表单是从我的网站内提交的。

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

【问题讨论】:

  • 我知道我可以添加`= hidden_​​field_tag :authenticity_token, form_authenticity_token`来添加真实性令牌,但我想知道它为什么不自动包含。
  • S3上传成功了吗? S3上传成功后,上传图片的哪些信息和表单一起提交?您没有显示任何代码,因此我们不得不猜测出了什么问题,但您似乎正在使用 AWS 开发工具包上传图像,然后将标准表单提交到您的 Rails 应用程序。 AWS SDK 不参与向 Rails 应用程序的表单提交,因此我不确定您为什么希望它自动向该提交添加标头。
  • @MarkB 是的,S3 上传成功,它返回 s3 存储桶中的图像 url,我将其包含在答案的正文中,然后我将表单提交给 Rails 应用程序。因此,我希望 AWS 开发工具包不会干预表单提交,但出于某种原因它确实如此。这有意义吗?
  • @MarkB 如果我没有在我的答案中上传图片,默认情况下标题包含 HTTP_X_CSRF_TOKEN,但是当通过 AWS SDK 上传图片时,标题不包含 HTTP_X_CSRF_TOKEN。跨度>
  • 由于没有代码,我只是假设没有图像您可以保存答案,但是当用户上传图像时,您会遇到此问题。只是想知道当您将文件上传到 s3 时是否关闭了您的真实性令牌,这会导致此问题。

标签: javascript ruby-on-rails ajax amazon-web-services aws-sdk


【解决方案1】:

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

<form class="edit_user" id="edit_user_6" action="/users/6/set_facilitator" accept-charset="UTF-8" data-remote="true" method="post">
  <input name="utf8" type="hidden" value="✓">
  <input type="hidden" name="_method" value="patch">
  <input type="hidden" name="authenticity_token" value="yrr7gWaLmE8ul4s0JcNmAU6H0YB+c7YR/8yCE7it+cRlG9lfdejTSFT7bhydWEQPSqv2E7gVPQ++9mvfJDfJeA==">
  <select class="form-control" data-submit="true" name="user[facilitator_id]" id="user_facilitator_id">

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

  Parameters: {"utf8"=>"√", "authenticity_token"=>"vcvY+cRQC0oM99l5+BFHu6GShPAedugTP1jRqXCxRa3bVGFLjLSVbMFk78aR5N0ol1WOu1noAo/GF6B67PSk6Q==", ...}

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

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

protect_from_forgery :except => :action_method

在此处查看文档:http://guides.rubyonrails.org/v5.0/working_with_javascript_in_rails.html#form-for 和此处http://guides.rubyonrails.org/v5.0/security.html#csrf-countermeasures

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 2021-01-13
    • 2017-11-28
    • 1970-01-01
    • 2020-05-06
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多