| 1234567891011121314151617181920212223242526272829303132333435363738394041 | from typing import Optionalfrom pydantic import validatorfrom clean_python import Jsonfrom clean_python import Scopefrom clean_python import Tenantfrom clean_python import Userfrom clean_python import ValueObject__all__ = ["Token"]class Token(ValueObject):    claims: Json    @validator("claims")    def validate_claims(cls, v):        if not isinstance(v, dict):            return v        assert v.get("sub"), "missing 'sub' claim"        assert v.get("scope"), "missing 'scope' claim"        assert v.get("username"), "missing 'username' claim"        if v.get("tenant"):            assert v.get("tenant_name"), "missing 'tenant_name' claim"        return v    @property    def user(self) -> User:        return User(id=self.claims["sub"], name=self.claims.get("username"))    @property    def scope(self) -> Scope:        return frozenset(self.claims["scope"].split(" "))    @property    def tenant(self) -> Optional[Tenant]:        if self.claims.get("tenant"):            return Tenant(id=self.claims["tenant"], name=self.claims.get("tenant_name"))        else:            return None
 |