feat(oidc): Profilbild vom Identitätsanbieter übernehmen

Schickt der Anbieter ein `picture`, wird es bei der Anmeldung geholt,
mittig auf 256x256 zugeschnitten und oben rechts angezeigt. Fehlt es
oder scheitert das Holen, bleibt es beim Buchstabenkreis - die
Anmeldung selbst hängt nicht davon ab.

Die Bildadresse kommt aus einem Token, also von außen. Erlaubt ist
deshalb ausschließlich der Ursprung aus OIDC_ISSUER, Weiterleitungen
eingeschlossen; dazu 4 MB und 5 Sekunden als Deckel. Ohne das wäre es
eine Aufforderung an den Server, für einen Fremden beliebige Adressen
im internen Netz anzufragen.

Neu: Migration 000019 (avatar_key/-source/-updated_at), Paket
internal/avatar, Route GET /api/v1/users/{id}/avatar. Der GC durchsucht
"avatars/" mit und kennt die Schlüssel - sonst räumte er die Bilder
nach einem Tag weg.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-24 13:43:22 +02:00
1 parent 3019e84681
commit 9f44215698
18 files changed
+814 -26

No files matched your search

+22
View File
@@ -188,6 +188,28 @@ Das Konto bleibt, das Passwort stünde sonst dauerhaft in einer Datei.
(Vorgabe „Sign in with SSO / OIDC"). „Anmelden mit PocketID" sagt dem, der
davorsteht, mehr als eine Abkürzung, die man kennen muss.
### Profilbild vom Anbieter
Schickt der Identitätsanbieter im Token ein `picture` (PocketID tut das, wenn
im Konto ein Bild hinterlegt ist), holt Aether es bei der Anmeldung ab,
schneidet es mittig quadratisch auf 256 px zu und zeigt es oben rechts. Ohne
Bild bleibt es beim farbigen Kreis mit dem Anfangsbuchstaben.
Es gibt dafür **keinen Schalter** – nichts einzustellen, nichts, was
fehlkonfiguriert sein kann:
* Geholt wird nur vom Anbieter selbst. Die Bildadresse kommt aus einem Token,
also von außen; erlaubt ist ausschließlich der Ursprung aus `OIDC_ISSUER`,
Weiterleitungen eingeschlossen. Sonst wäre es eine Aufforderung an den
Server, für einen Fremden beliebige Adressen im internen Netz anzufragen.
* Höchstens 4 MB, höchstens fünf Sekunden, höchstens einmal am Tag je Konto –
und nur, wenn sich die Adresse geändert hat oder noch kein Bild da ist.
* Scheitert etwas davon, geht die Anmeldung trotzdem durch. Ein nicht
erreichbares Bild ist kein Grund, jemanden auszusperren.
Ändert sich das Bild beim Anbieter, steht es hier spätestens am nächsten Tag –
oder sofort nach dem nächsten Abmelden und Anmelden.
**`OIDC_LINK_BY_USERNAME`** verbindet ein bestehendes Konto mit derselben
Kennung, statt ein zweites anzulegen. **Vor der ersten Anmeldung setzen** –
danach existiert das zweite Konto (`marc2`, leer, ohne Adminrecht) schon, und