Files
cie-auth/vendor/spid-cie-oidc-django/spid_cie_oidc/provider/schemas/jwt.py
T
2026-06-17 20:43:56 +02:00

68 lines
1.6 KiB
Python

import datetime
from typing import List
from django.conf import settings
from django.utils import timezone
from pydantic import BaseModel, HttpUrl, validator
from spid_cie_oidc.entity.utils import datetime_from_timestamp
try:
import spid_cie_oidc.entity.settings as entity_settings
NOW = timezone.localtime()
MAX_ACCEPTED_TIMEDIFF = getattr(
settings, "MAX_ACCEPTED_TIMEDIFF", entity_settings.MAX_ACCEPTED_TIMEDIFF
)
except ImportError: # pragma: no cover
NOW = datetime.datetime.now()
MAX_ACCEPTED_TIMEDIFF = 5
class JwtStructure(BaseModel):
iss: HttpUrl
sub: HttpUrl
iat: int
exp: int
jti: str
# TODO: migliorare: array di url con almeno uno
aud: List[HttpUrl]
@validator("exp")
def validate_exp(cls, exp):
now = int(NOW.timestamp())
if exp <= now:
raise ValueError("exp MUST be in the future")
@validator("iat")
def validate_iat(cls, iat):
dt_iat = datetime_from_timestamp(iat)
delta = datetime.timedelta(minutes=MAX_ACCEPTED_TIMEDIFF)
if abs((NOW - dt_iat).total_seconds()) > delta.total_seconds():
raise ValueError(f"iat MUST be in the last {MAX_ACCEPTED_TIMEDIFF} minutes")
class IdTokenJwt(JwtStructure):
# TODO: implementare
pass
class AccessTokenJwt(JwtStructure):
# TODO: implementare
pass
class RefreshTokenJwt(JwtStructure):
# TODO: implementare
pass
class UserInfoResponseJwtHeader(BaseModel):
# TODO: implementare
pass
class UserInfoResponseJwtPayload(JwtStructure):
# TODO: implementare
pass