30 lines
950 B
Python
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
|