Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions livekit-api/livekit/api/access_token.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,12 +270,23 @@ def verify(self, token: str, *, verify_signature: bool = True) -> Claims:
}
inference = InferenceGrants(**inference_dict)

observability_dict = claims.get("observability", dict())
observability_dict = {camel_to_snake(k): v for k, v in observability_dict.items()}
observability_dict = {
k: v
for k, v in observability_dict.items()
if k in ObservabilityGrants.__dataclass_fields__
}
observability = ObservabilityGrants(**observability_dict)

grant_claims = Claims(
identity=claims.get("sub", ""),
name=claims.get("name", ""),
kind=claims.get("kind", ""),
video=video,
sip=sip,
inference=inference,
observability=observability,
attributes=claims.get("attributes", {}),
metadata=claims.get("metadata", ""),
sha256=claims.get("sha256", ""),
Expand Down
16 changes: 16 additions & 0 deletions tests/api/test_access_token.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import jwt
import pytest
from livekit.api import AccessToken, TokenVerifier, VideoGrants, SIPGrants
from livekit.api.access_token import ObservabilityGrants
from livekit.protocol.room import RoomConfiguration
from livekit.protocol.agent_dispatch import RoomAgentDispatch

Expand Down Expand Up @@ -116,3 +117,18 @@ def test_verify_token_missing_exp() -> None:
token_verifier = TokenVerifier(TEST_API_KEY, TEST_API_SECRET)
with pytest.raises(Exception):
token_verifier.verify(token)


def test_verify_token_preserves_kind_and_observability() -> None:
token = (
AccessToken(TEST_API_KEY, TEST_API_SECRET)
.with_identity("test_identity")
.with_kind("agent")
.with_observability_grants(ObservabilityGrants(write=True))
.to_jwt()
)

claims = TokenVerifier(TEST_API_KEY, TEST_API_SECRET).verify(token)
assert claims.kind == "agent"
assert claims.observability is not None
assert claims.observability.write is True
Loading