Skip to main content

quadkit-auth

Authentication and authorization for the Quadkit Framework — JWT, OAuth2, SAML, RBAC, and multi-tenancy.


Overview

Complete authentication and authorization stack for Quadkit — JWT, OAuth2, RBAC, SAML, passkeys, and MFA. Provides a production-ready auth layer with multiple authentication strategies, policy-based access control, session management, and seamless integration with quadkit-web middleware.

Use AuthModule.configure() to register the auth bundle and protect routes with @require_auth, @require_roles, and @require_permissions decorators.

Full documentation: docs.quadkit.dev

Install

uv add quadkit-auth
# Optional extras
uv add "quadkit-auth[oauth2,saml]"

Quick Start

from quadkit import Application
from quadkit.di.module import Module, module
from quadkit.auth import AuthModule, AuthConfig, JWTConfig


@module(
    imports=[
        AuthModule.configure(
            config=AuthConfig(
                secret_key="your-secret-key",
                token=JWTConfig(secret_key="your-jwt-secret"),
            )
        )
    ]
)
class AppModule(Module):
    pass


async def main() -> None:
    async with Application.boot(modules=[AppModule]) as app:
        # app is running — resolve services from app.container
        ...


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

Configuration

Note: AuthConfig requires both secret_key and token.secret_key — pass an explicit config via AuthModule.configure().

Option 1 — YAML file

# application.yaml
auth:
  secret_key: "your-secret-key"
  token:
    secret_key: "your-jwt-secret"
    algorithm: "HS256"
    access_token_expire: "30m"
  rbac:
    enabled: true
    default_role: "viewer"
export QK_AUTH__SECRET_KEY=your-secret-key
export QK_AUTH__TOKEN__SECRET_KEY=your-jwt-secret
export QK_AUTH__TOKEN__ALGORITHM=HS256
export QK_AUTH__RBAC__DEFAULT_ROLE=viewer

Option 3 — Python

from quadkit.auth import AuthModule, AuthConfig, JWTConfig
from quadkit.contracts.core import Duration

config = AuthConfig(
    secret_key="your-secret-key",
    token=JWTConfig(
        secret_key="your-jwt-secret",
        algorithm="HS256",
        access_token_expire=Duration.minutes(30),
    ),
)
AuthModule.configure(config)

Config reference

Field Default Env var Description
secret_key — QK_AUTH__SECRET_KEY Top-level signing secret (required)
token.secret_key — QK_AUTH__TOKEN__SECRET_KEY JWT signing secret (required)
token.algorithm HS256 QK_AUTH__TOKEN__ALGORITHM JWT algorithm: HS256, RS256, ES256
token.access_token_expire 30m QK_AUTH__TOKEN__ACCESS_TOKEN_EXPIRE Access token lifetime (duration string, e.g. 30m, 1h30m)
rbac.enabled True QK_AUTH__RBAC__ENABLED Enable RBAC
rbac.default_role viewer QK_AUTH__RBAC__DEFAULT_ROLE Default role for new users

Module Factory Methods

Method Description
AuthModule.configure(...) Configure with explicit AuthConfig
AuthModule.stub() Minimal config for testing

Key Features

  • JWT authentication — HS256/RS256, key rotation, token blacklisting
  • OAuth2 / OIDC — authlib-backed: Google, GitHub, custom providers
  • SAML 2.0 — Enterprise SSO via pysaml2
  • Passkeys (WebAuthn) — FIDO2 device-based authentication
  • MFA (TOTP) — Time-based one-time passwords
  • RBAC — Role/permission inheritance with policy expressions
  • Session management — Device-aware sessions with concurrency limits
  • Token binding — IP address binding to prevent token theft

Testing

async with Application.boot(modules=[AuthModule.stub()]) as app:
    # your test code
    ...

Key Source Files

File What it contains
src/quadkit/auth/module.py AuthModule definition
src/quadkit/auth/config.py AuthConfig, JWTConfig, RBACConfig
src/quadkit/auth/di/bundle_provider.py AuthBundleProvider wiring
src/quadkit/auth/di/sub_providers/token_provider.py TokenProvider (boots policy)
src/quadkit/auth/authn/jwt.py JWTTokenManager implementation
src/quadkit/auth/authn/_jwt_lifecycle.py verify_token (enforces policy)
src/quadkit/auth/authz/service.py AuthorizationService

JWT verification policy

quadkit-auth enforces verified-only JWT decoding — signature verification cannot be disabled.

Environment Secret present Behaviour
PRODUCTION / STAGING yes Verified-only. Boot succeeds.
PRODUCTION / STAGING no Raises ConfigurationError at boot.
DEVELOPMENT yes Verified-only. Boot succeeds.
DEVELOPMENT no Verified-only. Boots with a generated ephemeral secret (tokens invalidated on restart).

Stable development secret

For multi-service development, set a stable secret via environment variable:

export QK_AUTH__TOKEN__SECRET_KEY="a-stable-dev-secret-at-least-32-chars"

Via Python config:

from quadkit.auth.config import AuthConfig, JWTConfig

config = AuthConfig(
    secret_key="a-stable-dev-secret-at-least-32-chars",
    token=JWTConfig(
        secret_key="a-stable-dev-secret-at-least-32-chars",
    ),
)

This prevents the common mistake of silently trusting unverified tokens in production when a secret env-var is missing.

Metadata

Release files for quadkit-auth 0.0.45

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

Source distribution (sdist)

Source distribution for quadkit-auth 0.0.45
File Size Uploaded Provenance
quadkit_auth-0.0.45.tar.gz 297.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for quadkit-auth 0.0.45
File Interpreter ABI Platform
quadkit_auth-0.0.45-py3-none-any.whl Python 3 none any Details

Total release size: 558.5 kB

Release files / quadkit_auth-0.0.45.tar.gz

Download URL quadkit_auth-0.0.45.tar.gz
Size 297.8 kB
Tags Source
SHA-256 checksum
How to use checksums
70b0891e5ca0b4442bbeafd20b9ce9d930bd5cbd39bae0f6f876207725a40ddf
BLAKE2b-256 checksum
How to use checksums
3379fbb7de345943d5c75a7d521e81a73afaefcceadfb276659aad393dada357
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / quadkit_auth-0.0.45-py3-none-any.whl

Download URL quadkit_auth-0.0.45-py3-none-any.whl
Size 260.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5b3c181725a939fc311d5a524c9cac17d55a465e0cb56db853576d03bf137b4b
BLAKE2b-256 checksum
How to use checksums
e5809ee66a21cdefa88ea5195dc20759dfc275338c99d8a3640d6a87da6cd4c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for quadkit-auth 0.0.45

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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