ActionDispatch :: Cookies не устанавливает заголовок Set-Cook ie в ответ, но response.set_cook ie делает - PullRequest
0 голосов
/ 02 августа 2020

У меня есть приложение только для 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) устанавливают заголовок в ответ? Это происходит в стойке?

Требование

  1. Мы хотим установить файлы cookie в запросе CORS.
  2. Мы хотим установить файлы cookie для всех источников

Что уже реализовано

  1. Клиент отправляет запрос с withCredentials
  2. В ответе Access-Control-Allow-Credentials: true и Access-Control-Allow-Origin: <origin (request.headers['origin'])> присутствуют
  3. Поскольку это приложение только для Rails API, мы включили в приложение следующие промежуточные программы:
config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore, key: '_namespace_key'

Вопрос

  1. Почему ActionDispatch :: Cookies не работает, а отвечает. set_cook ie работает?
  2. Когда ActionDispatch :: Cookies устанавливает заголовки в ответ? Это происходит в каком-либо хуке обратного вызова after в приложении rails, или это происходит в стойке? Потому что до after_action в Applicaton_controller заголовков не было.

Странно

  1. Пока в 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. Что мне не хватает?

1 Ответ

0 голосов
/ 07 августа 2020

Я понял причину такого поведения. На самом деле другая команда развернула application gateway на производстве. В результате сервер Rails получает HTTP-запрос, который изначально был HTTPS.

Теперь, когда я пометил свои файлы cookie как secure: true, похоже, что ActionDispatch :: Cookies даже не отправляет файлы cookie в ответ на запрос если протокол HTTP. Он будет отправлен только в том случае, если протокол HTTPS. Если я отключу защиту с помощью secure: false, он сработает, или если я отключу шлюз приложений, тогда он будет работать с ActionDispatch :: Cook ie.

Это кажется странным, поскольку secure является атрибутом на стороне клиента, но судя по поведению ActionDispatch :: Cookies, похоже, что он даже не отправляет файлы cookie с сервера, если протокол HTTP и для параметра secure установлено значение true.

Хотя я не нашел никакой документации по этому поведению, но вот как это работает.

...