У меня есть приложение только для Rails 5 API, и я хочу отправлять файлы cookie в ответ на запрос JSON. Когда я использую ActionDispatch :: Cookies для установки Cook ie в ответе на запрос, он не устанавливает заголовок Set-Cookie
в ответе. Хотя response.set_cookie
действительно работает.
Я также тестировал создание ловушки after_action
в контроллере приложения и увидел, что заголовок Set-Cookie
отсутствует в response.headers, но cookies ['name_of_cook ie '] присутствует. Еще один вопрос, который я хочу задать: когда эти файлы cookie (ActionDispatch :: Cookies) устанавливают заголовок в ответ? Это происходит в стойке?
Требование
- Мы хотим установить файлы cookie в запросе CORS.
- Мы хотим установить файлы cookie для всех источников
Что уже реализовано
- Клиент отправляет запрос с
withCredentials
- В ответе
Access-Control-Allow-Credentials: true
и Access-Control-Allow-Origin: <origin (request.headers['origin'])>
присутствуют - Поскольку это приложение только для Rails API, мы включили в приложение следующие промежуточные программы:
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'
Вопрос
- Почему ActionDispatch :: Cookies не работает, а отвечает. set_cook ie работает?
- Когда ActionDispatch :: Cookies устанавливает заголовки в ответ? Это происходит в каком-либо хуке обратного вызова
after
в приложении rails, или это происходит в стойке? Потому что до after_action
в Applicaton_controller заголовков не было.
Странно
- Пока в env разработки и на моей локальной машине он работает, но не в производстве. Должно ли это что-то делать с настройкой
domain
для Cook ie? Я также использую secure и httponly cook ie в производстве, но только httponly в разработке.
Что мне здесь не хватает? Я потратил несколько дней на поиск проблемы, но не смог найти решения. Любое зацепление будет очень полезным. Спасибо
Edit 1
cookies[@name.to_sym] = {
value: @value,
expires: @expire,
httponly: true,
same_site: 'None',
secure: false # It works when I set it to false but doesn't work with `true` in production. In development env it works with either one.
}
response.set_cookie(
@name.to_sym,
value: @value,
expires: @expire,
httponly: true,
secure: true
)
Я заметил одну вещь. Если я установил secure: false
в куки, тогда он будет работать в продакшене, но не с secure: true
. С другой стороны, secure: true
работает с response.set_cook ie в производстве.
Мой request.protocol - HTTP. Возможно ли, что ActionDispatch :: Cookies даже не устанавливает файлы cookie, если протокол запроса - HTTP и настроен параметр secure: true
.
Но я думаю, что secure: true
предназначен для стороны клиента. Например, если повар ie безопасен, браузер будет отправлять его только по протоколу https. Что мне не хватает?