У меня есть приложение Rails 5 API (ApplicationController < ActionController::API
). Пришла необходимость добавить простую форму GUI для одной конечной точки этого API.
Первоначально я получал ActionView::Template::Error undefined method protect_against_forgery?
, когда пытался обработать форму. Я добавил include ActionController::RequestForgeryProtection
и protect_from_forgery with:exception
к этой конечной точке. Что решило эту проблему, как ожидалось.
Однако, когда я пытаюсь представить эту форму, я получаю: 422
Unprocessable Entity
ActionController::InvalidAuthenticityToken
. Я добавил <%= csrf_meta_tags %>
и подтвердил, что meta: csrf-param
и meta: csrf-token
присутствуют в моих заголовках, и что authenticity_token
присутствует в моей форме. (Сами токены отличаются друг от друга.)
Я пробовал, protect_from_forgery prepend: true, with:exception
, никакого эффекта. Я могу "исправить" эту проблему, комментируя: protect_from_forgery with:exception
. Но я понимаю, что это отключает защиту CSRF в моей форме. (Я хочу CSRF-защиту.)
Что мне не хватает?
UPDATE:
Чтобы сделать это ясно, 99% этого приложения является чистым JSON RESTful API. Пришла необходимость добавить один HTML-вид и форму в это приложение. Поэтому для одного контроллера я хочу включить полную защиту CSRF. Остальное приложение не нуждается в CSRF и может оставаться неизменным.
ОБНОВЛЕНИЕ 2:
Я просто сравнил источник страницы этой формы HTML приложения и заголовка с другим обычным приложением Rails 5, которое я написал. authenticity_token
в заголовке и authenticity_token
в форме одинаковы. В приложении API у меня проблема, они разные. Может быть, что-то?
ОБНОВЛЕНИЕ 3:
Хорошо, это не проблема. Однако при дальнейшем сравнении между работающими и нерабочими приложениями я заметил, что в Network > Cookies нет ничего. Я вижу кучу таких вещей, как _my_app-session
в файлах cookie рабочего приложения.