Как настроить авторизацию с использованием js-SSR и SPA?
Здравствуйте!
Хочу разработать своё одностраничное веб-приложение, чтобы разобраться с современным и очень изменчивым миром веб-разработки. При этом хотелось бы воспользоваться технологией рендера страницы вместе с данными на сервере. Однако возникает проблема авторизации.
Предположим, что пользователь уже вошёл в аккаунт до этого, как я себе представляю повторное открытие сайта:
1. Первый запрос: клиент делает запрос frontend серверу вместе с данными идентификации и авторизации (скажем, id пользователя и токен; единственный вариант — сохранять их в куки), frontend сервер делает запрос к api серверу, передавая эти данные, затем api сервер отдаёт информацию о пользователе и контент текущей страницы (в том же json), frontend сервер рендерит это в готовую страницу и доставляет клиенту.
2. Последующие запросы: клиент напрямую обращается к api серверу, передавая те же (или обновлённые после первого запроса) данные авторизации, получает json и обрабатывает его самостоятельно.
Собственно, хочу перейти к вопросу. Верно ли я понимаю это взаимодействие? Можно ли сделать иначе / лучше? Есть ли инструменты, позволяющие, например, использовать компоненты frontend-фреймворка как компоненты MVC backend-фреймворка, чтобы рендером занимался один сервер без лишних запросов? Или унифицированный инструмент, который включает в себя единое написание кода для frontend и backend с решением этих проблем? Скажу сразу, не хотелось бы писать backend на JS.
Примерно представляю, как можно обойтись одним запросом при использовании AngularJS (с модулем для одностраничных приложений) и любого backend MVC-фреймворка; хотя полноценного рендера и не будет, но поисковым роботам не придётся ждать мой fetch, так как данные будут доставлены изначально, например, через тот же data-атрибут. Но в данном случае планирую выбрать в качестве стека Svelte (Sapper) и Ruby on Rails, хотя, думаю, это и не принципиально.
Спасибо за внимание к вопросу!
В общем, сделал именно так. Api-сервер устанавливает cookies, недоступные из веб-приложения, через ответ на Ajax запрос (самый банальный случай — при входе в аккаунт), а при последующем открытии сайта (при SSR) frontend сервер просто пробрасывает необходимые заголовки, в том числе и заголовок с cookies. В качестве api — rails (плюс, возможно, добавится что-то ещё), в качестве frontend сервера — sapper.