ActionDispatch :: Cookies не установлены в разных доменах - PullRequest
3 голосов
/ 06 июля 2019

У меня есть интерфейс React SPA, взаимодействующий с бэкэнд-API Rails.В производственной среде веб-интерфейс имеет доменное имя mysecretsite.com, а бэкэнд связан с mysecretsite.io

. Я использую ActionDispatch :: Cookies для установки токена доступа в браузере, поэтомучто пользователи могут делать последующие запросы с этим токеном.

cookies.signed[:access_token] = { value: 'tmp_token_string', httponly: true, domain: :all }

Это работает, как и ожидалось, когда React SPA и Rails API оба работают локально в разработке на одном компьютере.

После того, как я развернул ReactSPA и Rails API на разных серверах соответственно, я заметил, что куки не установлены должным образом в браузере.

Я могу воспроизвести такую ​​проблему в режиме разработки, когда я разместил React SPA на другом компьютере в той же локальной сети.

Я пытался настроить ActionDispatch :: Cookies такие параметры, как domain со строкой IP:Port React SPA для среды разработки или %w(.mysecretsite.com .mysecretsite.io) для производственной среды, или просто nil, ноэто ничего не изменило.

Что может быть пропущено в моих настройках cookie?

controllers / application_controller.rb

class ApplicationController < ActionController::API
    include ActionController::Cookies
end

config / application.rb

module RailsApp
   class Application < Rails::Application
       config.load_defaults 5.2
       config.api_only = true

       config.middleware.use ActionDispatch::Cookies
   end
end

24 часа спустя, у меня есть некоторая дополнительная информация:

Я посмотрел на заголовок ответа из браузера Chrome.В React SPA, работающем на том же компьютере с Rails API, файл cookie access_token установлен правильно.А вот заголовок ответа:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin: http://192.168.12.40:27511
Access-Control-Expose-Headers:
Access-Control-Max-Age: 1728000
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
ETag: W/"ebd48cd3b0ac4fa7ba23a4d40b8508a2"
Vary: Origin
X-Request-Id: 9aa588f0-8569-b1ca-901945962e87
X-Runtime: 0.064807

Пока React SPA работает на другом компьютере в той же локальной сети, файл cookie access_token не устанавливается, как это происходило в производственной среде.А вот заголовок ответа:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD
Access-Control-Allow-Origin: http://192.168.12.50:27511
Access-Control-Expose-Headers:
Access-Control-Max-Age: 1728000
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
ETag: W/"ebd48cd3b0ac4fa7ba23a4d40b8508a2"
Vary: Origin
X-Request-Id: 9aa588f0-8569-b1ca-901945962e87
X-Runtime: 0.059074

В обоих случаях заголовок Set-Cookie отсутствует, но один из них успешно установил cookie, а другой - не удалось.

1 Ответ

1 голос
/ 08 июля 2019

Я сам понял проблему.Я просто не могу назначить .com домен для React API, в то время как связать .io домен с Rails API.

Проблема в том, что

Вам нужно иметь как минимум два уровнядомена должен быть одинаковым для использования файлов cookie

, как указано в Файлы cookie для нескольких TLD?

В среде разработки, когда React SPA и RailsAPI работают на разных хостах, мой обходной путь - это присвоение общего локального доменного имени двум приложениям соответственно.

Во-первых, отредактируйте /etc/hosts как-то так:

192.168.12.40   mydevsite.com
192.168.12.10   api.mydevsite.com

Во-вторых, в RailsПриложение API, добавьте mydevsite.com:27511 в качестве дополнительного источника в файл config/initializers/cors.rb.И перезапустите Rails API для вступления в силу.

Наконец, обновите URL-адреса связанных запросов в React SPA и браузере.


24 часа спустя

Я могу подтвердить, что проблема также была решена в производственной среде, где Rails API настроен с новым доменным именем api.mysecretsite.com

Однако я до сих пор не знаю, почему официальная документация имеет пример настройки domain: %w(.example.com .example.org) и какие варианты использования они представляют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...