---
title: private-ops Auth Step-Up Architektur — Standing Decision 2026-05-15
type: project
tags: [private-ops, auth, mfa, totp, decision, kar-210]
date: 2026-05-15
status: aktiv
related: "[[CONTEXT]], `private-ops:docs/03-PRIVACY-TIERS.md`, [[phase-1-progress]]"
description: "Standing-Decision Kais 2026-05-15 17:05 zur TOTP-Step-Up-Strategie. Option B (sensitive paths only) gewählt. Option A (global step-up im (authed) layout) als Future-KAR fuer spaeter."
confidence: high
---

# private-ops Auth Step-Up Architektur — Standing Decision

## Kontext

KAR-210 TOTP-Test 2026-05-15 entdeckt: Magic-Link gibt AAL1-Session, `/home` oeffnet sich ohne TOTP-Step-Up obwohl Faktor enrolled ist. Frage: Soll private-ops global Step-Up enforce, oder nur fuer sensitive Pages?

## Entscheidung

**Option B gewaehlt** (Kais 2026-05-15 17:05): Status quo, TOTP nur server-side fuer `mfa.unenroll` enforced (durch Supabase native). Magic-Link reicht fuer /home und allgemeine Pages.

**Option A (Global Step-Up) ist Future-Roadmap** (neuer KAR angelegt).

## Aktuelles Behavior

| Action | AAL erforderlich | Wer enforced |
|---|---|---|
| Login via Magic-Link | none | — |
| /home, /settings (allgemein) | aal1 | requireUser() |
| /settings/security (View) | aal1 | requireUser() |
| TOTP enrollen | aal1 | Supabase Default |
| TOTP unenrollen | aal2 | Supabase server-side |

## Begruendung Option B

- **Single-User-Phase**: Aktuell nur Kais hat Login. Wenn jemand sein Email-Account kapert + Magic-Link abfängt → schon zu spät, TOTP würde auch nicht helfen weil eingeloggt.
- **Friction**: Magic-Link allein ist 2-Klicks (Email anfordern + Link klicken). Plus TOTP wäre 3-Klicks pro Session.
- **Server-side Schutz für sensitive actions**: `unenroll`, future `payment.execute`, `datev.export_finalize` laufen alle ueber Supabase + Capability-Tokens mit AAL2-Check.

## Trigger fuer Upgrade auf Option A

- Familien-Scope: mehr als 1 Mensch hat Login
- Tier-4-Daten im UI sichtbar (Steuer-Akte, Banking-Saldos, Arztbriefe)
- BMW-Pilot-Vorbereitung Kadi-v2 (Compliance-Druck)
- Tenant-Scope (Multi-Tenant Phase)

## Option A Implementation (geplant, nicht jetzt)

```ts
// apps/web/src/app/(authed)/layout.tsx
import { getCurrentAal, getUserMfaState } from '../../lib/auth/mfa';
import { redirect } from 'next/navigation';

const user = await requireUser();
const state = await getUserMfaState();
if (state.totpFactors.length > 0) {
  const aal = await getCurrentAal();
  if (aal === 'aal1') {
    redirect('/login/verify-mfa' as Parameters<typeof redirect>[0]);
  }
}
```

Aufwand: ca. 10 LOC + 1 Vitest-Case + manueller Re-Test.

## Verwandte KARs

- KAR-210 TOTP End-to-End Test (DONE 2026-05-15) — TOTP Enroll/Unenroll verifiziert
- (NEU) [FUTURE] Global TOTP Step-Up Layout-Upgrade — Backlog P3

## Verwandte Brain-Notes

- [[CONTEXT]] — private-ops Vision
- `private-ops:docs/03-PRIVACY-TIERS.md` — Tier-Klassifikation
- [[phase-1-progress]] — Phase 1 Status
