Zwei-Faktor-Anmeldung bei Calendarr

Deine Zugangsdaten stimmten. Der Fehler lag im gewählten Endpunkt:

  auth_router.py:81   if user.totp_enabled:
                          raise HTTPException(401, detail="2fa_required")

/api/auth/token nimmt nur ein Formular mit Benutzername und Passwort entgegen
und weist Konten mit zweitem Faktor grundsätzlich ab — mit demselben 401 wie
ein falsches Passwort. Deshalb stand da „Benutzername oder Passwort stimmen
nicht", obwohl beides stimmte.

Angemeldet wird jetzt über /api/auth/login: der Weg nimmt den Code entgegen
und kennt remember_me. Das ist hier keine Bequemlichkeit, sondern die
Bedingung — mit zweitem Faktor kann Onyx sich nicht selbst neu anmelden, den
Code hat nur der Mensch. Ein gewöhnliches Token hielte sieben Tage,
remember_me hält hundertachtzig.

Damit wandert auch das Token in den Schlüsselbund. Bei einem Konto mit
zweitem Faktor ist es das einzige, womit Onyx noch hineinkommt; ginge es beim
Beenden verloren, müsste man sich bei jedem Start neu anmelden.

Die drei Fälle sind jetzt auseinandergehalten und einzeln beschriftet:
falsches Passwort, fehlender Code, falscher Code. Der Unterschied ist der
zwischen „Passwort neu tippen" und „App aufmachen" — und er steckt beim
Server nur im Begleittext eines 401.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-14 13:44:26 +02:00
parent e2b86c0216
commit fde3e864c0
5 changed files with 185 additions and 35 deletions

View File

@@ -317,6 +317,38 @@
}
}
},
"calendarr.live.error.twoFactor": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Dieses Konto verlangt einen Zwei-Faktor-Code."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "This account requires a two-factor code."
}
}
}
},
"calendarr.live.error.twoFactorWrong": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Der Zwei-Faktor-Code stimmt nicht — er gilt nur eine halbe Minute."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Wrong two-factor code — its only valid for half a minute."
}
}
}
},
"widget.calendar.allDay": {
"localizations": {
"de": {