Заголовок запроса не включает HTTP_X_CSRF_TOKEN при использовании AWS JS SDK

У меня есть приложение Rails, где я могу публиковать ответы на вопросы через ajax, он отлично работает, однако я добавил aws-js-sdk script, чтобы иметь возможность загружать изображения в свой ответ из браузера, изображение будет загружаться на 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

Ответ 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, но если он отправляется непосредственно в Amazon, то он не будет использовать токены аутентификации. Amazon не имеет возможности узнать секретный ключ вашего приложения rails на вашем сервере. Покажите нам код HTML, который генерируется, чтобы увидеть, создает ли камень S3 отдельную форму, которая находится вне вашей основной формы, или пытается внедрить <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