"""Kurzlebige, signierte Tokens fuer den Zwischenschritt Passwort -> TOTP. Es wird bewusst KEIN Session-Cookie ausgestellt, solange der zweite Faktor nicht bestaetigt ist (siehe Konzept 6.2: "kein Login ohne TOTP moeglich"). """ from __future__ import annotations from itsdangerous import BadSignature, SignatureExpired, URLSafeTimedSerializer from app.config import settings _PENDING_MAX_AGE_S = 300 # 5 Minuten Zeitfenster fuer den TOTP-Schritt _serializer = URLSafeTimedSerializer(settings.session_secret.hex(), salt="jumphost-pending-totp") def create_pending_token(user_id: int) -> str: return _serializer.dumps({"uid": user_id}) def decode_pending_token(token: str) -> int | None: try: data = _serializer.loads(token, max_age=_PENDING_MAX_AGE_S) except (BadSignature, SignatureExpired): return None try: return int(data["uid"]) except (KeyError, TypeError, ValueError): return None