Skip to main content

English · Русский

Orcestr banner

orcestr-auth

PyPI Python License: MPL 2.0

Python authentication core and FastAPI/SQLAlchemy adapters for the Orcestr ecosystem.

The application keeps its real user model and product lifecycle. The package owns password, token, session, cookie, recovery, OAuth and WebSocket authentication mechanics.

Install

pip install "orcestr-auth[all]"

Optional groups:

Extra Includes
fastapi dependencies, cookie/CSRF flow and router factory
sqlalchemy auth models, direct user repository and Alembic operations
oauth GitHub, Google and Yandex provider clients
all every first-party adapter

Main APIs

Import Purpose
orcestr_auth config, password helpers, token codec and extension ports
orcestr_auth.sqlalchemy create_auth_models, UserFieldMap, user repository
orcestr_auth.services sessions, verification/reset codes and WebSocket tickets
orcestr_auth.oauth optional provider clients and normalized profiles
orcestr_auth.fastapi auth dependencies, redirect policy and router factory
orcestr_auth.migrations versioned Alembic operations for auth-owned schema

SQLAlchemy Wiring

Attach auth tables to the application's registry and real user primary key:

from orcestr_auth.sqlalchemy import UserFieldMap, create_auth_models

auth_models = create_auth_models(
    registry=Base.registry,
    user_model=UserORM,
)

user_fields = UserFieldMap(
    id=UserORM.id,
    username=UserORM.username,
    email=UserORM.email,
    password_hash=UserORM.password_hash,
    is_active=UserORM.is_active,
    email_verified_at=UserORM.email_verified_at,
)

This creates direct indexed queries and real foreign keys. It does not create a second user table and does not use runtime reflection.

FastAPI Wiring

from orcestr_auth.fastapi import create_auth_dependencies, create_auth_router

auth_dependencies = create_auth_dependencies(
    config=auth_config,
    session_dependency=get_control_db_session,
    user_model=UserORM,
    user_fields=user_fields,
    models=auth_models,
)

router = create_auth_router(
    config=auth_config,
    application_dependency=get_auth_http_application,
    current_user_dependency=auth_dependencies.current_user,
    register_model=RegisterRequest,
    user_response_model=UserRead,
)

Auth services raise the shared orcestr_core.ApiError. Register the Core middleware and handlers once on the application, then include the auth router:

from fastapi import FastAPI
from orcestr_core.fastapi import RequestIdMiddleware, register_api_error_handlers

app = FastAPI()
app.add_middleware(RequestIdMiddleware)
register_api_error_handlers(app)
app.include_router(router)

This preserves stable auth codes such as invalid_credentials, structured validation fields and x-request-id in the same envelope as the rest of the product API.

The consumer implements the small AuthHttpApplication boundary for product-specific work: user creation, legal acceptance, tenant bootstrap, email delivery, audit and rate limits. Standard endpoints, cookies and token responses remain library-owned.

OAuth 2.1 public clients

Register native/public clients with exact redirect URI allowlists. Client secrets are not used; Authorization Code always requires PKCE S256:

from orcestr_auth import AuthConfig, OAuth2ClientConfig

auth_config = AuthConfig(
    secret_key="...",
    oauth2_clients={
        "orcestr-real-translate": OAuth2ClientConfig(
            display_name="Orcestr Real Translate",
            redirect_uris=("com.orcestr.realtranslate://oauth/callback",),
            scopes=("openid", "profile", "email", "offline_access"),
        ),
    },
)

Each product must enumerate its complete, least-privilege scope set. A refresh token is returned only when the grant includes offline_access; online-only grants contain no refresh_token field.

Create OAuth2AuthorizationService from the same control-database session, auth models and user repository, then mount the adapter:

from orcestr_auth.fastapi import create_oauth2_router

oauth2_router = create_oauth2_router(
    config=auth_config,
    application_dependency=get_oauth2_application,
    current_user_dependency=auth_dependencies.current_user,
    oauth2_principal_dependency=auth_dependencies.require_oauth2_scopes("openid"),
    userinfo_response_model=UserInfoResponse,
)
app.include_router(oauth2_router, prefix="/api/v1/auth/oauth2")

The adapter exposes GET /authorize/ for validated UI context, POST /authorize/ for code issuance, POST /token/ for authorization_code and refresh_token grants, and POST /revoke/, and—when its explicit principal dependency is supplied—GET /userinfo/. The application userinfo(principal) hook decides the response fields; expose profile and email claims only when those scopes are present on principal.scopes. Token and revoke endpoints accept JSON or application/x-www-form-urlencoded; every response is non-cacheable. A cookie-authenticated authorization POST must include X-Requested-With: XMLHttpRequest.

Ordinary current_user dependencies reject client-bound access tokens by default. Resource endpoints intended for OAuth clients must opt in with auth_dependencies.require_oauth2_scopes("required_scope"); this bearer-only dependency checks the signed JWT against the live server session, enabled client registration and both the granted and currently registered scopes. The service-level revoke() result is True only when it actually revoked a live client session, allowing consumers to avoid false success audit events; the RFC-compatible HTTP endpoint remains an empty 200 response.

Registered redirect URIs must use HTTPS, loopback-only HTTP, or a private-use reverse-domain native scheme such as com.orcestr.realtranslate. Userinfo, fragments, dangerous schemes and malformed URIs are rejected before exact allowlist matching.

Apply orcestr_auth.migrations.v0_4.upgrade after the immutable v0.1 schema when integrating the new authorization-code table and nullable client/scope session bindings.

Security Model

  • browser tokens live in HttpOnly cookies and never appear in browser auth JSON;
  • cookie mutations require the configured CSRF header;
  • refresh tokens are opaque, hashed, rotated and replay-protected;
  • access JWTs validate issuer, audience, expiry, type, JTI and server session state;
  • recovery codes are hashed, expiring, attempt-limited and one-time;
  • OAuth validates redirects and supports state/PKCE without implicit account linking;
  • native OAuth uses exact registered redirects, short-lived hashed one-time codes and PKCE S256, with refresh rotation bound to the client and granted scope;
  • client-bound access tokens are denied on ordinary API dependencies and require an explicit, server-session-backed scope guard;
  • WebSocket access uses short-lived one-time tickets.

See security invariants and architecture boundaries.

Development

uv sync --frozen
uv run pytest -q
uv build

Ecosystem

License

Licensed under the Mozilla Public License 2.0. Commercial use is permitted; see the repository NOTICE and trademark policy.

Release files for orcestr-auth 0.4.0

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

Source distribution (sdist)

Source distribution for orcestr-auth 0.4.0
File Size Uploaded
orcestr_auth-0.4.0.tar.gz 48.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for orcestr-auth 0.4.0
File Interpreter ABI Platform
orcestr_auth-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 92.0 kB

Release files / orcestr_auth-0.4.0.tar.gz

Download URL orcestr_auth-0.4.0.tar.gz
Size 48.1 kB
Tags Source
SHA-256 checksum
How to use checksums
2190255a4de48bdbe02732053405be16c372b2f17e22deb899ac83cb79af00ae
BLAKE2b-256 checksum
How to use checksums
3d0e2b7c9b4ca1dcacf79a255c8900fe8f841cd6526c93984de76bedd1bb2912
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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 / orcestr_auth-0.4.0-py3-none-any.whl

Download URL orcestr_auth-0.4.0-py3-none-any.whl
Size 44.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9759815d0c800d6a40f253f4c46a75118e299ba49730c8a0034a643b706ee5fd
BLAKE2b-256 checksum
How to use checksums
8bceb9718f840461fc68467539c763e2b530b850df89b23e6d978e8c86cb12a1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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 history Release notifications | RSS feed

0.4.2

2 release files

0.4.1

2 release files

This release

0.4.0 This release

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

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