Я пытаюсь получить полное кэширование страниц в Rails, но я столкнулся с большой проблемой в отношении CSRF - или, возможно, просто моего понимания этого. В настоящее время у меня есть строка form_authenticity_token
, хранящаяся в файле cookie, к которому JS может получить доступ и переписать теги заголовка.
Есть два места, где я нахожу токены в сгенерированном HTML:
1) В голове
<meta name="csrf-token" content="[hash]">
2) Внутри скрытого элемента ввода формы
<input type="hidden" name="authenticity_token" value="[different hash]">
Как указано, эти хэши отличаются друг от друга (в режиме разработки, где кэширование не включено). Почему они разные? Почему я могу удалить метатеги заголовка и оставить ввод формы в покое, а запрос разрешен? Тем не менее, когда я удаляю тег ввода формы и оставляю заголовки, запрос отклоняется?
Фактически это означает, что теги head бесполезны, не так ли? Я могу переписать тег ввода формы в значение в моем файле cookie, как я сделал с тегами заголовка, но, поскольку они отличаются друг от друга, я с осторожностью отношусь к тому, что может означать конечный результат, особенно когда речь идет о полном кэшировании страницы. .
Контроллер приложений содержит:
protect_from_forgery with: :exception
before_filter :csrf_cookie
def csrf_cookie
cookies['authenticity-token'.freeze] = {
value: form_authenticity_token,
expires: 1.day.from_now,
secure: (Rails.env.staging? || Rails.env.production?)
}
end