Files
ssh-jumphost/app/security/pending_totp.py
2026-08-19 22:33:19 +02:00

30 lines
950 B
Python

"""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