fix(auth): Sitzungen ueber die Benutzer-ID statt ueber den Namen aufloesen
Das Sitzungs-Token trug den Benutzernamen als Subjekt, und get_current_user suchte danach. Eine Umbenennung machte damit jedes Token auf jedem anderen Geraet stillschweigend ungueltig — der Nutzer flog ohne Hinweis raus. Tokens tragen jetzt zusaetzlich uid, die unveraenderliche Zeilen-ID, und die Aufloesung geht darueber. sub bleibt als Anzeigename erhalten. Tokens ohne uid werden weiter ueber den Namen aufgeloest, damit vor der Aenderung ausgestellte Sitzungen gueltig bleiben — mit "Angemeldet bleiben" laufen die 180 Tage. Fuer SSO war die Zuordnung schon vorher richtig: OIDCIdentity haengt an (provider_key, sub) des Providers, und bei bekanntem sub wird der lokale Benutzername nicht angefasst. Ein umbenannter Nutzer in Authentik landet also unveraendert auf demselben Konto. Vier Tests halten beide Richtungen fest: Umbenennung beim Provider, lokale Umbenennung mit weiterlaufender Sitzung, lokale Umbenennung mit erhaltener SSO-Verknuepfung, und die Kompatibilitaet alter Tokens. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
cc4daf4a84
commit
725b61c8cb
@@ -9,7 +9,7 @@ from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
import models
|
||||
from auth import create_access_token, get_current_user, get_password_hash, verify_password
|
||||
from auth import create_user_token, get_current_user, get_password_hash, verify_password
|
||||
from database import get_db
|
||||
|
||||
# When "Angemeldet bleiben" is ticked the token lives for half a year.
|
||||
@@ -61,7 +61,7 @@ def setup(req: SetupRequest, db: Session = Depends(get_db)):
|
||||
db.add(models.UserSettings(user_id=user.id))
|
||||
db.commit()
|
||||
db.refresh(user)
|
||||
token = create_access_token({"sub": user.username})
|
||||
token = create_user_token(user)
|
||||
return {"access_token": token, "token_type": "bearer", "user": _user_dict(user)}
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ def login(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="2fa_required",
|
||||
)
|
||||
token = create_access_token({"sub": user.username})
|
||||
token = create_user_token(user)
|
||||
return {"access_token": token, "token_type": "bearer", "user": _user_dict(user)}
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ def login_json(req: LoginRequest, db: Session = Depends(get_db)):
|
||||
detail="Ungültiger 2FA-Code",
|
||||
)
|
||||
expires = REMEMBER_ME_EXPIRY if req.remember_me else None
|
||||
token = create_access_token({"sub": user.username}, expires_delta=expires)
|
||||
token = create_user_token(user, expires_delta=expires)
|
||||
return {"access_token": token, "token_type": "bearer", "user": _user_dict(user)}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user