Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Swarmauri Logo

PyPI - Downloads Hits PyPI - Python Version PyPI - License PyPI - swarmauri_tokens_jwt Discord

swarmauri_tokens_jwt

A standard JWT token service for the Swarmauri framework. This service implements minting and verifying JSON Web Tokens and exposes a JWKS endpoint for public key discovery.

Installation

Install the service with your preferred Python packaging tool:

pip install swarmauri_tokens_jwt
poetry add swarmauri_tokens_jwt
uv pip install swarmauri_tokens_jwt

Features

  • Mint and verify JWS/JWT tokens backed by any :class:~swarmauri_core.key_providers.IKeyProvider
  • Supports algorithms like HS256, RS256, ES256, PS256 and EdDSA
  • Adds standard temporal claims (iat, nbf, and optional exp) plus issuer, subject, audience and scope defaults when minting tokens
  • Validates expiration, not-before, issuer and audience claims during verification
  • Publishes a JWKS endpoint for public key discovery through your key provider
  • Install the optional cryptography dependency to enable RSA, ECDSA and EdDSA signing keys

Usage

JWTTokenService requires an asynchronous IKeyProvider to supply signing material. The example below shows how to mint and verify a symmetric HS256 token using a minimal in-memory key provider.

import asyncio
import base64
from swarmauri_tokens_jwt import JWTTokenService
from swarmauri_core.key_providers import (
    ExportPolicy,
    IKeyProvider,
    KeyRef,
    KeyUse,
)
from swarmauri_core.crypto.types import JWAAlg, KeyType


class InMemoryKeyProvider(IKeyProvider):
    def __init__(self) -> None:
        self.secret = b"secret"
        self.kid = "sym"
        self.version = 1

    def supports(self) -> dict[str, list[str]]:
        return {}

    async def create_key(self, spec):
        raise NotImplementedError

    async def import_key(self, spec, material, *, public=None):
        raise NotImplementedError

    async def rotate_key(self, kid, *, spec_overrides=None):
        raise NotImplementedError

    async def destroy_key(self, kid, version=None) -> bool:
        return False

    async def get_key(self, kid, version=None, *, include_secret=False) -> KeyRef:
        material = self.secret if include_secret else None
        return KeyRef(
            kid=self.kid,
            version=self.version,
            type=KeyType.OPAQUE,
            uses=(KeyUse.SIGN,),
            export_policy=ExportPolicy.SECRET_WHEN_ALLOWED,
            material=material,
        )

    async def list_versions(self, kid):
        return (self.version,)

    async def get_public_jwk(self, kid, version=None):
        return {}

    async def jwks(self) -> dict:
        k = base64.urlsafe_b64encode(self.secret).rstrip(b"=").decode()
        return {"keys": [{"kty": "oct", "kid": f"{self.kid}.{self.version}", "k": k}]}

    async def random_bytes(self, n: int) -> bytes:
        return b"\x00" * n

    async def hkdf(self, ikm: bytes, *, salt: bytes, info: bytes, length: int) -> bytes:
        return b"\x00" * length


async def main() -> None:
    svc = JWTTokenService(InMemoryKeyProvider(), default_issuer="issuer")
    token = await svc.mint(
        {"sub": "alice"},
        alg=JWAAlg.HS256,
        kid="sym",
        lifetime_s=600,  # override the default one-hour lifetime if needed
    )
    claims = await svc.verify(token, issuer="issuer")
    assert claims["sub"] == "alice"


asyncio.run(main())

verify retrieves the JSON Web Key Set from the provider and enforces expiration, not-before, issuer and audience checks before returning the decoded claims. Expose the service's :meth:jwks coroutine to publish the active public keys from your provider.

The service also supports asymmetric algorithms such as RS256, ES256 and EdDSA when the key provider exposes the appropriate keys. See the docstrings in :mod:swarmauri_tokens_jwt for additional details on the API surface.

Want to help?

If you want to contribute to swarmauri-sdk, read up on our guidelines for contributing that will help you get started.

Metadata

Release files for swarmauri_tokens_jwt 0.11.0.dev1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for swarmauri_tokens_jwt 0.11.0.dev1
File Size Uploaded
swarmauri_tokens_jwt-0.11.0.dev1.tar.gz 9.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for swarmauri_tokens_jwt 0.11.0.dev1
File Interpreter ABI Platform
swarmauri_tokens_jwt-0.11.0.dev1-py3-none-any.whl Python 3 none any Details

Total release size: 20.3 kB

Release files / swarmauri_tokens_jwt-0.11.0.dev1.tar.gz

Download URL swarmauri_tokens_jwt-0.11.0.dev1.tar.gz
Size 9.5 kB
Tags Source
SHA-256 checksum
How to use checksums
0ce76ce303db77bb1291393cab6991a369bff50654b57d88f73c168c89540e12
BLAKE2b-256 checksum
How to use checksums
510dadf3603aec55d4e5aa4a7fa5cde630517d1224d5a4633713e1b9b89e1808
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / swarmauri_tokens_jwt-0.11.0.dev1-py3-none-any.whl

Download URL swarmauri_tokens_jwt-0.11.0.dev1-py3-none-any.whl
Size 10.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
68fc39a0523dc224d3490a33c6137060d54b678c4dec434a6357aa2244df5805
BLAKE2b-256 checksum
How to use checksums
3fd6128e784509e915598feebc3cd87b29f728a2d877f07b083188528408dabd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page