token.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. from typing import Optional
  2. from pydantic import 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. @validator("claims")
  12. def validate_claims(cls, v):
  13. if not isinstance(v, dict):
  14. return v
  15. assert v.get("sub"), "missing 'sub' claim"
  16. assert v.get("scope"), "missing 'scope' claim"
  17. assert v.get("username"), "missing 'username' claim"
  18. if v.get("tenant"):
  19. assert v.get("tenant_name"), "missing 'tenant_name' claim"
  20. return v
  21. @property
  22. def user(self) -> User:
  23. return User(id=self.claims["sub"], name=self.claims.get("username"))
  24. @property
  25. def scope(self) -> Scope:
  26. return frozenset(self.claims["scope"].split(" "))
  27. @property
  28. def tenant(self) -> Optional[Tenant]:
  29. if self.claims.get("tenant"):
  30. return Tenant(id=self.claims["tenant"], name=self.claims.get("tenant_name"))
  31. else:
  32. return None