Skip to main content

Seamless, zero-config authentication and authorization for the Jetio framework.

Project description

Jetio Auth 🔐

Seamless, zero-config authentication for the Jetio framework.

jetio-auth is a battery-included authentication plugin designed to get your application secured in minutes. It bridges your SQLAlchemy database models directly to your API, handling password hashing, JWT token issuance, and granular permission policies automatically.


✨ Key Features

  • 🧠 Intelligent Auto-Discovery: Automatically detects your admin flags (is_admin, is_superuser, etc.). No configuration required.
  • 🏗️ Dynamic Schema Generation: Inspects your SQLAlchemy User model and instantly generates a Pydantic validation schema for registration. (Adds age, phone, etc., to the API automatically!)
  • 🛡️ Secure by Default:
    • Built-in Bcrypt password hashing.
    • Mass Assignment Protection (prevents users from registering as admins).
    • Standardized JWT (JSON Web Token) flow.
  • 🔌 Drop-in Mixins: Provides a JetioAuthMixin to equip your models with auth columns instantly.

📦 Installation

pip install jetio-auth 

🚀 Quick Start

  1. Define your User Model

Inherit from JetioAuthMixin to get hashed_password and is_admin columns automatically.

# models.py
from jetio.jetio import JetioModel
from jetio_auth.mixins import JetioAuthMixin
from sqlalchemy.orm import Mapped, mapped_column

class User(JetioModel, JetioAuthMixin):
    # You define the identity fields (username/email)
    username: Mapped[str] = mapped_column(unique=True)
    email: Mapped[str] = mapped_column(unique=True)
    
    # Custom fields are automatically added to the Register API!
    age: Mapped[int] = mapped_column(default=18)
  1. Initialize the Auth Router

In your main application file:

# app.py
from jetio_auth import AuthRouter
from models import User

# Initialize the router with your model
# The plugin automatically detects 'is_admin' and builds the schemas.
auth = AuthRouter(user_model=User)

# Register endpoints (/login, /register)
auth.register_routes(app)

# Register admin management endpoints (/admin/{id}/make-admin)
auth.register_admin_routes(app)
  1. Protect your Routes

Use the provided policies to secure your data.

from jetio.jetio import CrudRouter

# Example: A router where only the Owner (or an Admin) can edit/delete
CrudRouter(
    model=Post,
    secure=True,
    auth_dependency=auth.get_auth_dependency(), # Validates JWT
    policy={
        "PUT": auth.owner_or_admin(Post),
        "DELETE": auth.owner_or_admin(Post),
        "POST": auth.get_auth_dependency() # Any logged-in user
    }
).register_routes(app)

🛠️ Utilities Creating the First Admin

Since the API protects against self-promotion, use the ensure_admin helper in your startup script.

async def init_db():
    async with AsyncSession(engine) as session:
        # Idempotent: safe to run on every startup
        await auth.ensure_admin(
            db=session,
            username="admin",
            password="securePassword123",
            email="admin@jetio.org"
        )

Manual Admin Promotion

If you are already an admin, you can promote other users via the API:

POST /admin/5/make-admin
Authorization: Bearer <your-admin-token>

⚙️ How it works The "Single Source of Truth"

jetio-auth doesn't force you to use a specific column name for permissions. It scans your model for standard flags in this order:

is_admin

is_superuser

is_staff

is_master

Whichever it finds first, it locks onto as the authority for admin_only policies. Dynamic Validation

When a user hits /register, the plugin doesn't just look for username/password. It looks at your User table columns:

age: int → API requires an Integer (or Optional if default exists).

bio: str → API accepts a String.

is_admin → Excluded automatically for security.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jetio_auth-0.1.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jetio_auth-0.1.0-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file jetio_auth-0.1.0.tar.gz.

File metadata

  • Download URL: jetio_auth-0.1.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.11

File hashes

Hashes for jetio_auth-0.1.0.tar.gz
Algorithm Hash digest
SHA256 dca5661a08da20f76021bb998bedcb22cbf338ba171905afec79aebd337329f5
MD5 cf7ae9f163221f0fc09886ca8d451873
BLAKE2b-256 d3951db79cca58daa400fe5b4d21f7856845b9aff3402c9f491d8b3386d2048a

See more details on using hashes here.

File details

Details for the file jetio_auth-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: jetio_auth-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.11

File hashes

Hashes for jetio_auth-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 298af17e9173ed56b60acb48a6d9d9e63142f388cf946db235a3fd6c4cd65917
MD5 1483ddc71b5a60227208806d008b5d82
BLAKE2b-256 aa04d7c39efb0038c2dfc9ba38977d965337b47470af3bd41ddf13b1f5cd942f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page