BFF на NestJS должен проксировать cookie Sanctum
Laravel владеет /api/login и httpOnly auth_token. Nest мапит DTO. Второй JWT в памяти это вторая личность.
После logout гард Nest всё ещё отдавал предыдущего пользователя. На части продуктов NestJS стоит перед Laravel. Браузер по-прежнему говорит JSON под /api. Auth только cookie: /api/login, /api/register, /api/logout, /api/user. Токен живёт в httpOnly auth_token. Nest это BFF, не второй IdP.
Поломка была выпустить Nest JWT после того, как Laravel уже поставил cookie. У SPA тогда двое часов. Logout, который чистил cookie, оставлял JWT в памяти. Guards в Nest, которые верили JWT и игнорировали cookie, отдавали чужого пользователя после refresh. Пользователи видели чужое имя. Laravel уже вернул 401.
Хосту нужна одна личность. Nest выдумал вторую.
Проксировать Cookie, мапить DTO
Nest принимает запрос браузера, копирует заголовок Cookie в Laravel и мапит JSON. Токен он не разбирает. CSRF идёт из той же банки cookie. CORS узкий: same site, credentials on, токена в теле нет.
Очередь остаётся в Horizon или Messenger на PHP. Nest не должен растить второй префикс Redis для job, у которых уже есть забор в MySQL. TypeScript-воркер, который ретраит HTTP без этого забора, это тот же двойной платёж с более красивым стектрейсом.
Я смотрел Set-Cookie в ответе Nest. Если Nest переписывал auth_token или добавлял Bearer в тело, BFF стал IdP. Axios на Nest должен проксировать Cookie и CSRF-заголовок и не вешать Authorization из памяти. 401 от Laravel должен сбрасывать user в request-scope Nest. Декодированный JWT до рестарта процесса держать нельзя.
Когда Nest единственный API
Если Laravel нет, Nest всё равно не кладёт сессию в localStorage. httpOnly cookie и BFF, который не эхоит секрет, это то же правило. Этот сайт на Laravel Sanctum. Путь Nest есть на других хостах. Правило cookie от языка не меняется.
Ещё я перестал кэшировать /api/user в памяти процесса Nest. Этот кэш переживал logout для следующего запроса на том же инстансе. Личность это cookie, которую поставил Laravel, проверка на каждый вызов, или 401.
Какой опыт из этого
Меряю logout потом /api/user через Nest и грепаю BFF на подпись JWT и localStorage. 401 от Laravel при 200 от Nest это две личности.
Nest JWT рядом с Sanctum и кэшу текущего пользователя в процессе я не верю. Проксировать Cookie. Мапить DTO. Токен не разбирать.
Правило, которое оставляю: логином владеет Laravel. Nest не выпускает вторую сессию. Job остаются на PHP с забором в MySQL. Токена в JSON нет ни на каком хосте.
