CV laden

Backend

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.

Der Browser sendet auth_token. Nest reicht weiter. Laravel ist die Wahrheit.
Der Browser sendet auth_token. Nest reicht weiter. Laravel ist die Wahrheit.

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.

Ein Cookie, eine Identität. Nest mint keinen zweiten Session-Store.
Ein Cookie, eine Identität. Nest mint keinen zweiten Session-Store.

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.

Zurück zu Notizen