68 lines
1.6 KiB
Python
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
|