feat(appview): Bearer-Auth für Timeline und Notifications
Die AppView hatte keinerlei Authentifizierung: jeder konnte /api/notifications?did=<beliebig> lesen und per /seen als gelesen markieren. Mit Phase 8 sind das die ersten privaten Daten im System. Das Access-JWT der PDS trug von Anfang an sub, scope "com.atproto.access" und aud "did:web:appview…" — es war für die AppView ausgestellt, nur hat sie es nie geprüft. Neu ist deshalb vor allem die Schlüsselbeschaffung: auth.rs holt das DID-Dokument der PDS (PDS_INTERNAL_URL, sonst PDS_PUBLIC_URL), cached den Schlüssel und lädt ihn bei einem Verifikationsfehler nach — höchstens einmal pro Minute, damit Müll-Tokens kein Werkzeug werden, die PDS zu fluten. Ein Schlüsselwechsel braucht damit keinen Neustart. Ist die PDS beim Start weg, warnt die AppView nur und startet trotzdem (sie indiziert den Firehose, der von der lokalen PDS unabhängig ist). Ist der Schlüssel beim Prüfen eines Tokens nicht zu beschaffen, gibt es 503 — fail closed. Geschützt: /api/timeline/home und die drei Notification-Endpoints, jeweils mit sub == did. Öffentlich bleiben Profile, Suche, Posts, Threads und die Follower-Listen; das sind in AT Proto öffentliche Records. 401 AuthMissing / 401 TokenInvalid / 403 Forbidden / 503 AuthUnavailable. TokenInvalid ist ein Vertrag mit dem Client: daran erkennt er, dass er sein Token erneuern und einmal wiederholen muss. Dazu CORS: statt Any für alles jetzt eine Allowlist über APPVIEW_CORS_ORIGINS (unset = altes Verhalten plus Warnung), und /internal/ingest-commit liegt außerhalb der CORS-Schicht — die Route wird server-zu-server aufgerufen, ein Allow-Origin darauf würde nur einer Webseite helfen, in den Index zu schreiben. APPVIEW_AUTH_REQUIRED=false stellt das alte Verhalten her (VPN-Instanz, fail-open-Tests) und warnt beim Start in Großbuchstaben. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013HC9HLrUU1LNwkzp8nkDLX
This commit is contained in:
co-authored by
Claude Opus 5
parent
786a892658
commit
a2a371b7d9
@@ -62,8 +62,36 @@ PLC_DIRECTORY_URL=https://plc.directory
|
||||
# PLC_DIRECTORY_URL=http://127.0.0.1:2582
|
||||
|
||||
# --- AppView ingest auth (optional, dev ok if unset) ---
|
||||
# Wenn gesetzt, muss die PDS denselben Wert als Header
|
||||
# `X-Ingest-Secret` mitschicken; ist er nicht gesetzt, nimmt
|
||||
# /internal/ingest-commit unauthentifizierte Writes entgegen (jeder,
|
||||
# der den Port erreicht, kann Posts/Follows/Notifications fälschen).
|
||||
# Die AppView warnt beim Start, solange er fehlt.
|
||||
# APPVIEW_INGEST_SECRET=change-me-to-a-shared-secret-between-pds-and-appview
|
||||
|
||||
# --- AppView auth (Bearer-Token der PDS) ---
|
||||
# Erzwingt ein gültiges Access-JWT auf den privaten Endpoints
|
||||
# (/api/notifications, /api/notifications/count,
|
||||
# /api/notifications/seen, /api/timeline/home); `sub` im Token muss
|
||||
# dem `did`-Parameter entsprechen, sonst 403. Default: true.
|
||||
# Den öffentlichen P-256-Schlüssel holt sich die AppView von
|
||||
# `PDS_INTERNAL_URL` (sonst `PDS_PUBLIC_URL`) unter
|
||||
# /.well-known/did.json — `PDS_JWT_SECRET` verlässt die PDS nie.
|
||||
# Auf `false` verhält sich die AppView wie vor der Auth-Einführung
|
||||
# (alles öffentlich): nötig für die fail-open-Integrationstests mit
|
||||
# synthetischen DIDs und für eine Instanz, die schon per VPN
|
||||
# abgeschottet ist. Die AppView warnt beim Start laut, wenn er aus ist.
|
||||
# APPVIEW_AUTH_REQUIRED=true
|
||||
# Kommaseparierte Allowlist der Browser-Origins, die `/api/*` aufrufen
|
||||
# dürfen. Nicht gesetzt = bisheriges Verhalten
|
||||
# (`Access-Control-Allow-Origin: *`) plus Startup-Warnung.
|
||||
# Der Tauri-Webview hat je nach Plattform eine eigene Origin:
|
||||
# macOS/iOS `tauri://localhost`, Windows `http://tauri.localhost`,
|
||||
# im Dev-Modus der Vite-Server `http://127.0.0.1:1430`.
|
||||
# `Authorization` steht immer in den erlaubten Headern (sonst
|
||||
# scheitert der Preflight), `allow_credentials` bleibt aus.
|
||||
# APPVIEW_CORS_ORIGINS=tauri://localhost,http://127.0.0.1:1430
|
||||
|
||||
# --- Tauri-Client (Build-/Laufzeit-Overrides des Desktop-Clients) ---
|
||||
# MAARCADETWEET_PDS_URL=http://127.0.0.1:2583
|
||||
# MAARCADETWEET_APPVIEW_URL=http://127.0.0.1:2584
|
||||
|
||||
Reference in New Issue
Block a user