Skip to content

fix(dev): lt dev stellt dem App-Prozess ein Session-Passwort bereit - #93

Open
DKoenig9 wants to merge 1 commit into
mainfrom
fix/lt-dev-session-password
Open

fix(dev): lt dev stellt dem App-Prozess ein Session-Passwort bereit#93
DKoenig9 wants to merge 1 commit into
mainfrom
fix/lt-dev-session-password

Conversation

@DKoenig9

Copy link
Copy Markdown

Das Problem

Nuxt/h3 verweigert Sessions ohne Passwort von mindestens 32 Zeichen — jeder Login antwortet mit 500 (H3Error: Empty password).

nuxt dev fängt das ab, weil der Dev-Server die .env des Projekts liest. lt dev test serviert den gebauten Nitro-Server, und der liest sie nie. Ein Projekt mit vollkommen korrekter .env sieht deshalb die halbe E2E-Suite an Assertions scheitern, die mit der eigentlichen Ursache nichts zu tun haben.

Aufgefallen in SWF DNA: 42 von 92 Playwright-Tests rot. Drei Läufe mit identischer .env, einziger Unterschied war der Export in die Shell:

.env vorhanden, kein Export → 42 rot
.env vorhanden, kein Export → 42 rot
.env vorhanden, mit Export  → 92 grün

Der CI-Job desselben Projekts erzeugt die Variable selbst und war nie betroffen — genau deshalb fällt es lokal auf und in der Pipeline nicht.

Die Änderung

lt dev stellt dem App-Prozess die Variable jetzt selbst bereit, wie der CI-Job es tut.

Datei Änderung
src/lib/dev-env.ts App-Env bekommt NUXT_SESSION_PASSWORD, abgeleitet aus dem Projekt-Slug
src/lib/dev-env-bridge.ts Wert wandert nach .lt-dev/.env, damit externe Testrunner einen Stack, der sich anmelden kann, von einem unterscheiden können, der bei jedem Login 500 liefert
src/lib/dev-patches.ts Die Variable steht jetzt im CLAUDE.md-Abschnitt, den lt dev in Projekte schreibt

Zwei bewusste Entscheidungen:

Deterministisch statt zufällig. Abgeleitet als sha256('lt-dev:session:<slug>'), erste 32 Hex-Zeichen. Damit überleben Sessions ein lt dev down / up, und alle Stacks von lt dev test --shard N stimmen überein — bei einem Zufallswert pro Prozess hätte jeder Shard einen anderen. Unterschiedliche Projekte bekommen unterschiedliche Werte, sodass die Cookies eines Stacks nie gegen einen anderen validieren.

Ein projekteigener Wert gewinnt. Der Schlüssel wird nur ergänzt, wenn die geerbte Umgebung keinen trägt — lt dev füllt eine Lücke, es überschreibt nichts.

Zur Einordnung: Das ist kein Geheimnis und soll keines sein. Es existiert, damit ein lokaler Stack ohne handgesetzte Umgebungsvariablen bootet, und erreicht keine deployte Umgebung.

Tests

3 neue Fälle in __tests__/dev-env.test.ts: Länge (h3s 32-Zeichen-Minimum), Determinismus (gleicher Slug gleich, anderer Slug verschieden) und dass ein projekteigener Wert unangetastet bleibt.

Volle Suite: 64/64 Suites, 974 Tests grün, Lint grün.

Ein Hinweis nebenbei

npm ci schlägt auf main fehl — package-lock.json ist nicht synchron (Missing: @emnapi/core@1.11.3, @emnapi/runtime@1.11.3). Besteht unabhängig von diesem PR; ich habe die Lockfile bewusst aus dem Commit gelassen, weil sie thematisch nicht dazugehört. Sag Bescheid, wenn das hier mit rein soll.

Nuxt/h3 verweigert Sessions ohne Passwort von mindestens 32 Zeichen: jeder
Login antwortet mit 500 "H3Error: Empty password". `nuxt dev` faengt das ueber
die .env des Projekts ab, `lt dev test` serviert aber den gebauten
Nitro-Server, und der liest sie nie. Folge in SWF DNA: 42 von 92
Playwright-Tests fielen an Assertions um, die mit der Ursache nichts zu tun
hatten (DEV-2972).

Der App-Prozess bekommt den Wert jetzt aus lt dev. Deterministisch aus dem
Slug abgeleitet statt zufaellig, damit Sessions einen Neustart ueberleben und
alle Shards von `lt dev test --shard N` uebereinstimmen. Ein Projekt, das
selbst einen Wert setzt, behaelt ihn - der Schluessel wird nur ergaenzt, wenn
die geerbte Umgebung keinen traegt.

Der Wert wandert zusaetzlich in .lt-dev/.env, damit externe Testrunner einen
Stack, der sich anmelden kann, von einem unterscheiden koennen, der bei jedem
Login 500 liefert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant