Phase 10c: Cards-Web SSO-Login gegen mana-auth
Some checks are pending
CI / validate (push) Waiting to run

Echte Anmeldung gegen auth.mana.how/api/v1/auth/login statt
Dev-Stub-User-ID. accessToken (EdDSA-JWT, 15 min TTL) + Profil
(email, name, tier) leben in localStorage; jeder API-Call schickt
`Authorization: Bearer <jwt>`. Bei 401 wird die Session lokal
geleert — User landet beim nächsten Render auf der Login-Page.

`devUser.id` bleibt eine Vereinfachte UI-Sentinel (gibt id wenn
JWT ODER Dev-Stub aktiv) — alle existierenden Importer
funktionieren unverändert. Dev-Stub-Pfad bleibt als Fallback für
Tests + Anki-Importer-Migration. Filename `dev-stub.svelte.ts`
behalten, Inhalt komplett umgebaut (Sprint 10d wäre der Rename).

Account-Page zeigt Email + Name + Tier statt nur UUID. Header
zeigt Email statt UUID. Login-Form auf Landing-Page mit Email +
Passwort, error-Anzeige, autocomplete-Hints für Browser-Manager.

uploadMedia (multipart) angepasst: Bearer first, X-User-Id-Stub
als Fallback.

svelte-check 384 files 0 errors, 7 Web-Tests grün, prod-Build
sauber.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-08 21:08:06 +02:00
parent a960d09e5b
commit 7119756ce6
6 changed files with 236 additions and 55 deletions

View file

@ -68,18 +68,18 @@
{#if devUser.id}
<a
href="/account"
class="truncate max-w-[180px] text-[var(--color-muted)] hover:text-[var(--color-fg)]"
title={devUser.id}
class="truncate max-w-[200px] text-[var(--color-muted)] hover:text-[var(--color-fg)]"
title={devUser.user?.email ?? devUser.id}
>
{devUser.id}
{devUser.user?.email ?? devUser.user?.name ?? devUser.id}
</a>
{:else}
<button
<a
href="/"
class="rounded bg-[var(--color-primary)] px-3 py-1 text-[var(--color-primary-fg)]"
onclick={() => devUser.set(prompt(t('landing.dev_user_prompt')) ?? '')}
>
{t('nav.login_dev')}
</button>
Login
</a>
{/if}
</div>
</div>