JWT token service for Swarmauri
Project description
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 optionalexp) 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
cryptographydependency 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swarmauri_tokens_jwt-0.3.0.dev49.tar.gz.
File metadata
- Download URL: swarmauri_tokens_jwt-0.3.0.dev49.tar.gz
- Upload date:
- Size: 9.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fea54fda8849b42dfe6a864df917aac16329bf552ec5a276e444484e281db6d3
|
|
| MD5 |
8fd65b1c72b1f9fb55c0f68e3b987e9e
|
|
| BLAKE2b-256 |
c3ec2ebfc0e89c290f55d47d5fe877f9348a28e9c4251e7f030ddb449a3d671c
|
File details
Details for the file swarmauri_tokens_jwt-0.3.0.dev49-py3-none-any.whl.
File metadata
- Download URL: swarmauri_tokens_jwt-0.3.0.dev49-py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f5485c21360cf21f2cd6bfc59fefe30c6f71fba0ddd4293b27923dfbc2daf66
|
|
| MD5 |
d1cf0fb9c96ee17ed42a68b3029fea7c
|
|
| BLAKE2b-256 |
e07aa7979849c8215dca3e240d1ed33b0c55e05c3c01b4a2c15ebd99c5db0748
|