Как сеансы cook ie -http-only должны работать на SPA с отдельным сервером API? - PullRequest
0 голосов
/ 07 марта 2020

При попытке выяснить , как пройти аутентификацию с Facebook / Google в контексте создаваемого SPA, кто-то указал мне на Прекратить использование JWT для сеансов .

Я пытаюсь попробовать, используя HTTP-Cookies. Мой сервер Ruby на Rails с Devise, а мой клиент JavaScript с React, хотя концептуальное решение не зависит от специфики c технологии, которую я считаю.

Мое приложение загружается при переходе на projectx.lvh.me и затем делает запрос к api.projectx.lvh.me для выборки текущего пользователя. Сначала он пуст, потому что пользователь не вошел в систему. Когда для входа в систему сделан запрос вызова, ответ от api.projectx.lvh.me содержит сессионный повар ie, ура! Но следующий запрос, который projectx.lvh.me делает к api.projectx.lvh.me, не несет повара ie, поэтому, кажется, повар ie навсегда потерян. Даже открытие api.projectx.lvh.me на другой вкладке не показывает повара ie. Это должно работать? Чего мне не хватает?

Я думал, что это было заблокировано сторонним поваром ie блокировкой, и поэтому мы не можем использовать куки в этом сценарии, и мы должны использовать токены jwt (хранящиеся на поваре ie, локальное хранилище или хранилище сеансов).

1 Ответ

0 голосов
/ 08 марта 2020

Мне удалось заставить файлы cookie работать в этом сценарии, добавив config/initializers/session_store.rb в мое приложение Rails, содержащее:

Rails.application.config.session_store :cookie_store, key: 'session', domain: :all

, из-за которого сессия Cook ie была не для api.projectx.lvh.me, а для .projectx.lvh.me.

Во внешнем интерфейсе API-вызовы должны были включать withCredentials, что при Ax ios для параметра withCredentials было установлено значение true:

Axios.post(`${apiEndPoint()}/users`, { user: values }, { withCredentials: true })

и с fetch это была опция credentials, установленная на "include":

fetch(`${apiEndPoint()}/graphql`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    credentials: "include",
    body: JSON.stringify({
        query: operation.text,
        variables,
    }),
})
...