Ein NestJS-BFF muss das Sanctum-Cookie weiterreichen
Laravel besitzt /api/login und das httpOnly auth_token. Nest mappt DTOs. Ein zweites JWT im Speicher ist eine zweite Identität.
Nach Logout lieferte ein Nest-Guard noch den vorherigen User. Manche Produkte stellen NestJS vor Laravel. Der Browser spricht weiter JSON unter /api. Auth bleibt cookie-only: /api/login, /api/register, /api/logout, /api/user. Der Token lebt in httpOnly auth_token. Nest ist ein BFF, kein zweites IdP.
Der Fehler war ein Nest-JWT, nachdem Laravel das Cookie gesetzt hatte. Die SPA hatte dann zwei Uhren. Ein Logout, der das Cookie leerte, ließ das JWT im Speicher. Nest-Guards, die dem JWT trauten und das Cookie ignorierten, lieferten nach Refresh den falschen User. Nutzer sahen einen fremden Namen. Laravel hatte schon 401 geliefert.
Der Host braucht eine Identität. Nest hatte eine zweite erfunden.
Cookie weiterreichen, DTO mappen
Nest nimmt den Browser-Request, kopiert den Cookie-Header nach Laravel und mappt JSON. Den Token parst es nicht. CSRF folgt demselben Cookie-Jar. CORS bleibt eng: same site, credentials an, kein Token im Body.
Queue-Arbeit bleibt in Horizon oder Messenger auf PHP. Nest sollte kein zweites Redis-Prefix für Jobs wachsen, die schon einen Zaun in MySQL haben. Ein TypeScript-Worker, der HTTP ohne diesen Zaun retried, ist dieselbe Doppelabbuchung mit schönerem Stacktrace.
Ich habe Set-Cookie auf der Nest-Antwort gelesen. Schrieb Nest auth_token um oder hängte einen Bearer-Body an, war der BFF ein IdP. Die Axios-Instanz in Nest muss Cookie und CSRF-Header weiterreichen und kein Authorization aus dem Speicher setzen. Ein 401 von Laravel muss den request-scoped User in Nest leeren. Ein dekodiertes JWT bis zum Prozess-Neustart darf nicht bleiben.
Wenn Nest die einzige API ist
Ist Laravel weg, darf Nest die Session trotzdem nicht in localStorage legen. Ein httpOnly-Cookie und ein BFF, der das Geheimnis nicht echoet, ist dieselbe Regel. Diese Site nutzt Laravel Sanctum. Der Nest-Pfad existiert auf anderen Hosts. Die Cookie-Regel ändert sich mit der Sprache nicht.
Ich habe auch aufgehört, /api/user pro Nest-Prozess im Speicher zu cachen. Dieser Cache überlebte Logout für den nächsten Request auf derselben Instanz. Identität ist das Cookie, das Laravel setzt, geprüft bei jedem Call, oder 401.
Was ich daraus mitnehme
Ich messe Logout, dann /api/user durch Nest, und grepe den BFF nach JWT-Sign und localStorage. Ein 401 von Laravel bei 200 von Nest sind zwei Identitäten.
Einem Nest-JWT neben Sanctum und einem Prozess-Cache des aktuellen Users traue ich nicht. Cookie weiterreichen. DTO mappen. Den Token nicht parsen.
Die Regel, die ich behalte: Laravel besitzt Login. Nest mint keine zweite Session. Jobs bleiben auf PHP mit dem MySQL-Zaun. Kein Token im JSON-Body, auf keinem Host.
