У меня есть интерфейс 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, а другой - не удалось.