second commit
This commit is contained in:
29
app/security/pending_totp.py
Normal file
29
app/security/pending_totp.py
Normal file
@ -0,0 +1,29 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user