axioms-core-py
Core JWT authentication and authorization library for Python web frameworks.
Overview
axioms-core-py provides framework-agnostic JWT token validation, JWKS management with background refresh, and claim-based authorization. This is the foundation for framework-specific integrations:
- axioms-flask-py - Flask integration
- axioms-fastapi - FastAPI integration
- axioms-drf-py - Django REST Framework integration
Note: For most use cases, use one of the framework integrations above instead of using this package directly.
Supports
- JWT token validation with automatic JWKS retrieval
- Background JWKS refresh with thread-safe caching
- Algorithm validation (only secure asymmetric algorithms allowed)
- Token type validation (typ header)
- Issuer validation (iss claim)
- Claim-based authorization (scopes, roles, permissions)
- Custom claim name support for different authorization servers
- Comprehensive logging with JWT ID (jti) tracking
Prerequisite
- Python 3.10+
Installation
pip install axioms-core-py
Quick Start
Configuration
from axioms_core import AxiomsConfig
config = AxiomsConfig(
AXIOMS_AUDIENCE="your-api-audience",
AXIOMS_ISS_URL="https://auth.example.com", # Recommended
# Or use AXIOMS_DOMAIN for simpler setup:
# AXIOMS_DOMAIN="auth.example.com",
)
Initialize JWKS Manager (Optional)
For production, initialize at startup to enable background refresh:
from axioms_core import initialize_jwks_manager, shutdown_jwks_manager
# At startup
initialize_jwks_manager(
config=config,
refresh_interval=3600, # Refresh every hour
cache_ttl=7200, # Cache for 2 hours
prefetch=True # Fetch JWKS immediately
)
# At shutdown (optional - auto-cleanup on exit)
shutdown_jwks_manager()
Token Validation
from axioms_core import get_key_from_jwks_json, check_token_validity
import jwt
# Extract token header
header = jwt.get_unverified_header(token)
kid = header.get("kid")
alg = header.get("alg")
# Get public key from JWKS
key = get_key_from_jwks_json(kid, config)
# Validate token
payload = check_token_validity(
token=token,
key=key,
alg=alg,
audience=config.AXIOMS_AUDIENCE,
issuer=config.AXIOMS_ISS_URL,
)
if payload:
print(f"Valid token for user: {payload.sub}")
Authorization Checks
from axioms_core import check_scopes, check_roles, check_permissions
# Check scopes (space-separated or list)
has_scope = check_scopes(payload.scope, ["read:data"])
# Check roles (list)
has_role = check_roles(payload.roles, ["admin"])
# Check permissions (list)
has_perm = check_permissions(payload.permissions, ["users:read"])
Configuration Options
See AxiomsConfig class for all options:
config = AxiomsConfig(
# Required
AXIOMS_AUDIENCE="your-api-audience",
# Recommended (choose one)
AXIOMS_ISS_URL="https://auth.example.com",
# AXIOMS_DOMAIN="auth.example.com",
# AXIOMS_JWKS_URL="https://auth.example.com/.well-known/jwks.json",
# Optional
AXIOMS_TOKEN_TYPS=["JWT", "at+jwt"], # Allowed token types
AXIOMS_SAFE_METHODS=["OPTIONS"], # HTTP methods to bypass auth
# JWKS settings
AXIOMS_JWKS_REFRESH_INTERVAL=3600, # 1 hour
AXIOMS_JWKS_CACHE_TTL=7200, # 2 hours
AXIOMS_JWKS_PREFETCH=True,
# Custom claim names (for different auth servers)
AXIOMS_SCOPE_CLAIMS=["scope", "scp"],
AXIOMS_ROLES_CLAIMS=["roles", "cognito:groups"],
AXIOMS_PERMISSIONS_CLAIMS=["permissions"],
)
Configuration Hierarchy
AXIOMS_ISS_URL→ constructs →AXIOMS_JWKS_URL(if not set)AXIOMS_DOMAIN→ constructs →AXIOMS_ISS_URL→AXIOMS_JWKS_URL(if not set)
Security
- Allowed algorithms: RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512
- Token type validation: Validates
typheader against allowed types - Issuer validation: Validates
issclaim to prevent token substitution - Expiration validation: Validates
expclaim exists and is valid - Comprehensive logging: All validation failures logged with jti (if available)
License
MIT License - see LICENSE file for details.
Metadata
Release files for axioms-core-py 0.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| axioms_core_py-0.0.5.tar.gz | 35.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| axioms_core_py-0.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 53.2 kB
Release files / axioms_core_py-0.0.5.tar.gz
| Download URL | axioms_core_py-0.0.5.tar.gz |
|---|---|
| Size | 35.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d9803b2bc6ae983d081a1fb1de9ded539bf816d0f808b9db308a075b4f18a2e3
|
|
BLAKE2b-256 checksum How to use checksums |
5159e39288df6d9c08cdf8321e4b2a4de57b2325a34db24cf5c7c4657920aab5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 24, 2025.
Transparency logRelease files / axioms_core_py-0.0.5-py3-none-any.whl
| Download URL | axioms_core_py-0.0.5-py3-none-any.whl |
|---|---|
| Size | 18.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
65a2bff5f9211428932909dde4da6d389b04ea156732bea2b26fe2b6e0cfd40c
|
|
BLAKE2b-256 checksum How to use checksums |
91d3f8103340a569ffc6bf622b89467a7ad663e34ec790567cd91f72344216bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 24, 2025.
Transparency log