2016-01-10 5 views
1

Я представляю форму в Rails4 от Modal. Это решение работает отлично в Rails 3.xОшибка: не удается проверить рельсы аутентификации маркера CSRF

код выглядит следующим образом:

<div class="modal fade" id="copy-product-addons"> 
    <div class="modal-dialog"> 
    <div class="modal-content"> 
     <div class="modal-header"> 
     <button type="button" class="close" data-dismiss="modal">×</button> 
     <h4>Copy Add-Ons From:</h4> 
     </div> 
     <div class="modal-body"> 
     <form id="addons-copy" method="POST" action="<%= copy_addons_product_path(@product) %>"> 
      <%= select_tag "from", options_from_collection_for_select(@shop.enabled_products - [@product], 'id', 'name'), :class => "form-control %> 
     </form> 
     </div> 
     <div class="modal-footer"> 
     <a href="#" class="btn btn-danger" data-dismiss="modal">Cancel</a> 
     <a href="#" onclick="$('#addons-copy').submit(); return false;" class="btn btn-primary">Copy Add-ons</a> 
     </div> 
    </div> 
    </div> 
</div> 
<% end %> 

В ответ, вместо выполнения конкретных действий он повторно направляет меня на страницу входа в систему с помощью Логин меня.

Ответ в терминале выглядит следующим образом:

> Started POST "/products/10168/copy_addons" for 127.0.0.1 at 2016-01-10 
> 21:19:10 +0100 Processing by ProductsController#copy_addons as HTML 
> Parameters: {"from"=>"10130", "id"=>"10168"} Can't verify CSRF token 
> authenticity Redirected to http://myr-d.dev/login Filter chain 
> halted as :require_login rendered or redirected 

Спасибо

+1

Не похоже, что вы устанавливаете токен CSRF. Использовать помощник «form_tag» Rails –

+0

Возможный дубликат [Невозможно подтвердить подлинность токена CSRF в рельсах] (http://stackoverflow.com/questions/11986939/cant-verify-csrf-token-authenticity-in-rails) –

+2

@CristianoAlencar: Этот ответ больше соответствует строкам внешнего запроса API. Кажется, это внутренний запрос на сервер, который должен использовать только соглашения Rails CSRF. Как отметил @WesFoster, использование 'form_tag' будет правильно устанавливать токен. Вот хорошая публикация SO, которую я нашел, которая хорошо объясняет этот материал CSRF: http://stackoverflow.com/questions/941594/understanding-the-rails-authenticity-token. – dwenzel

ответ

5

В Rails 4, есть соглашения, которые препятствуют CSRF атак на HTML-запросы. Это сообщение SO объясняет общую концепцию хорошо: Understanding the Rails Authenticity Token

Похоже, что ваш контроллер проверяет токен CSRF, но ваша форма не отправляет его. Это связано с тем, что в вашем представлении используется тег ручной работы <form>, который не содержит требуемого скрытого токена.

Если вы используете Rails form_tag вспомогательный метод, Rails автоматически генерирует маркер подлинности для вас, что затем будет отправлен вместе, как часть формы:

<div class="modal-body"> 
    <%= form_tag(copy_addons_product_path(@product), id: "addons-copy") do %> 
    <%= select_tag "from", options_from_collection_for_select(@shop.enabled_products - [@product], 'id', 'name'), :class => "form-control %> 
    <% end -%> 
</div> 

Если проверить HTML, которые будут получать сгенерированный из это, вы увидите скрытый тег ввода; что-то вроде этого:

<input name="authenticity_token" type="hidden" value="NrOp5bsjoLRuK8IW5+dQEYjKGUJDe7TQoZVvq95Wteg=" />

Это как маркер отправляется как часть формы. Затем ваш контроллер будет сравнивать это с текущим токеном, чтобы проверить, нет ли попытки CSRF, и вы больше не должны сталкиваться с этой ошибкой.

Смежные вопросы