auth: OIDC/lokal inloggning + device-flow för klienter, sessioner per användare
All checks were successful
build-and-push / build (push) Successful in 18s
release-client / build-release (push) Successful in 48s

Ersätter den delade AGENT_HELM_TOKEN med en riktig auth-modell:

- Webben loggar in med lokala konton ELLER OIDC (Authentik/Keycloak/…), valt
  per server. Inloggning ger en HMAC-signerad cookie; WS autentiseras via cookien.
- Klienten (daemon) kopplas via device-flödet (RFC 8628-likt): `agent-helm connect`
  skriver ut en URL, du loggar in + godkänner i webben, och får ett klient-token
  som identifierar din användare. Token sparas i ~/.config/agent-helm/.
- Sessioner är per användare (web ser bara sina egna; admin ser alla). Flera
  klient-instanser = flera parallella sessioner; --new tvingar ny, annars resume.
- Identitet är utbytbar (lokal/OIDC) men device-flödet + sessionerna är alltid
  agent-helms egna → funkar för vem som helst som hostar detta, med eller utan IdP.
- Bootstrap-admin via env (engångs) eller first-run-setup i UI:t. Klient-creds
  kan listas/återkallas; minimal admin-UI (skapa användare, konfigurera OIDC).

Nya filer: server/store.ts (JSON-store, scrypt, cookies), server/oidc.ts
(auth-code+PKCE), web/lib/api.ts. Verifierat end-to-end lokalt (login → device
→ approve → daemon-WS → web ser sessionen; web utan cookie nekas).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U68YyHsxU91ecsen84WQV4
This commit is contained in:
2026-06-29 01:21:29 +02:00
parent 98c4d13360
commit 94259b3456
12 changed files with 1704 additions and 403 deletions

View File

@@ -155,8 +155,14 @@ konfigurerade, och att en trasig hook aldrig låser en session.
## Åtkomst, auth & notiser (Pi5)
- **Auth:** ingen delad token. **Webben** loggar in med **lokala konton** *eller*
**OIDC** (Authentik/Keycloak/…) — väljs per server. **Klienten** kopplas via
**device-flödet**: den skriver ut en URL, du loggar in och godkänner i webben, och
får då ett klient-token som identifierar din användare. Sessioner är per användare;
klienter kan återkallas individuellt. Första admin seedas via
`AGENT_HELM_ADMIN_USER/PASSWORD` (engångs) eller en first-run-setup i UI:t.
- **Åtkomst:** primärt via **Tailscale** (inget exponerat publikt). Alternativt via din
NPM-reverse-proxy på t.ex. `agent.brasse-pc.eu` med auth framför.
NPM-reverse-proxy på t.ex. `agent.brasse-pc.eu` (TLS terminerar i NPM → Secure-cookie).
- **Notiser:** self-hostad **ntfy** på Pi5 pushar till mobilen när en session väntar på
input. Servern postar till ett ntfy-topic; PWA:n / ntfy-appen tar emot.
- **Registry:** server- och daemon-images byggs och pushas till `192.168.0.19:5000`.
@@ -189,17 +195,21 @@ pnpm install \
--virtual-store-dir /home/brasse/.cache/agent-helm/vstore
# (På vanlig Linux-fs räcker: pnpm install)
# Konfig: kopiera och sätt en token
cp .env.example .env # sätt AGENT_HELM_TOKEN + VITE_AGENT_HELM_TOKEN
# Konfig: kopiera och sätt bootstrap-admin (lokalt läge)
cp .env.example .env # sätt AGENT_HELM_ADMIN_USER/PASSWORD (engångs)
# Kör de tre delarna i var sin terminal:
pnpm dev:server # control-plane på :8787
pnpm dev:daemon # kör `gemini` i en pty, ansluter till servern
pnpm dev:web # Vite-dev-server — öppna länken i webbläsaren
pnpm dev:web # Vite-dev-server (proxar /api + /ws → :8787)
# I en tredje terminal: logga in klienten + kör agenten
pnpm --filter @agent-helm/daemon start -- connect --server http://localhost:5173
```
Logga in i web-UI:t med samma token, välj sessionen och styr den. Sätt
`AGENT_CMD=bash` för daemonen om du vill testa pipelinen utan Gemini-auth.
1. Öppna Vite-länken, logga in som admin (eller kör first-run-setupen).
2. Daemonen skriver ut en URL — öppna den, godkänn klienten.
3. Daemonen ansluter och dyker upp i din session-lista. Styr den i webben.
Sätt `AGENT_CMD=bash` för daemonen om du vill testa pipelinen utan Gemini-auth.
## Status