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

时间:2016-09-05 15:26:21

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

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

我像这样包含了这个库:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

<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如何工作,但如果它直接提交给亚马逊,那么它将不会使用真实性令牌。亚马逊无法知道您服务器上的rails应用程序的密钥。向我们展示生成的HTML代码,以查看S3 gem是否创建了一个位于主窗体之外的单独表单,或者是否尝试在另一个<form>中嵌入<form>,这是无效的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