token.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from typing import Optional
  2. from pydantic import field_validator
  3. from clean_python import Json
  4. from clean_python import Scope
  5. from clean_python import Tenant
  6. from clean_python import User
  7. from clean_python import ValueObject
  8. __all__ = ["Token"]
  9. class Token(ValueObject):
  10. claims: Json
  11. @field_validator("claims")
  12. @classmethod
  13. def validate_claims(cls, v):
  14. if not isinstance(v, dict):
  15. return v
  16. assert v.get("sub"), "missing 'sub' claim"
  17. assert v.get("scope"), "missing 'scope' claim"
  18. assert v.get("username"), "missing 'username' claim"
  19. if v.get("tenant"):
  20. assert v.get("tenant_name"), "missing 'tenant_name' claim"
  21. return v
  22. @property
  23. def user(self) -> User:
  24. return User(id=self.claims["sub"], name=self.claims["username"])
  25. @property
  26. def scope(self) -> Scope:
  27. return frozenset(self.claims["scope"].split(" "))
  28. @property
  29. def tenant(self) -> Optional[Tenant]:
  30. if self.claims.get("tenant"):
  31. return Tenant(id=self.claims["tenant"], name=self.claims["tenant_name"])
  32. else:
  33. return None