This release is a pre-release and may not be stable for production use.
FastAPI Accounts ⚡
Modern, zero-boilerplate authentication and complete account management for FastAPI.
💡 The Vision
Django developers have django-allauth.
TypeScript developers have Better-Auth and Lucia.
FastAPI developers deserve a modern, batteries-included authentication and account management engine.
Today, building authentication in FastAPI usually means either:
- Writing 1,000+ lines of custom boilerplate (Argon2 hashing, JWT/token issuance, password reset tokens, email verification, OAuth state handling) for every new project.
- Wrestling with complex generic typing and multi-file wiring in older libraries that are now in maintenance mode.
- Paying steep monthly fees to vendor-locked cloud auth providers (Clerk, Auth0).
FastAPI Accounts solves this: an async-first, zero-boilerplate authentication and account management engine built natively for FastAPI, Pydantic v2, and Async SQLAlchemy 2.0.
📖 Read our full story: The Journey of FastAPI Accounts (JOURNEY.md).
✨ Key Features
- ⚡ 15-Line Setup: Complete authentication system mounted with a single router and sensible defaults.
- 🍪 Native Dual-Transport:
- For Web & SPAs (React, Next.js, Vue, Svelte): Secure
HttpOnlySameSite=Laxcookies with built-in CSRF protection. - For Mobile & CLI (iOS, Flutter, React Native, Postman):
Authorization: Bearer <token>with refresh token rotation.
- For Web & SPAs (React, Next.js, Vue, Svelte): Secure
- 📬 Real-World Account Management:
- Multiple email addresses per account (Primary + Verified state machine, just like GitHub).
- Secure, stateless cryptographic email verification workflows (
/verify-email&/request-verify-email).
- 🛡️ Modern Security Primitives:
- Modern Argon2id password hashing via
pwdlib. - Active session tracking (view devices/IPs, "Logout everywhere").
- Modern Argon2id password hashing via
- 🚀 Modern Python Native:
- Built exclusively for Python 3.10+, Pydantic v2, and Async SQLAlchemy 2.0.
- Ready-to-use model mixins that plug directly into your existing Alembic migrations.
🚀 Quickstart (15 Lines of Code)
1. Installation
pip install fastapi-accounts --pre
# or with uv:
uv add fastapi-accounts --prerelease=allow
2. Basic Application (app.py)
from contextlib import asynccontextmanager
from fastapi import Depends, FastAPI
from fastapi_accounts import FastAPIAccounts, SQLAlchemyAdapter
# 1. Initialize the adapter and account engine
adapter = SQLAlchemyAdapter(database_url="sqlite+aiosqlite:///./accounts.db")
accounts = FastAPIAccounts(adapter=adapter, secret_key="super-secret-key-change-me")
@asynccontextmanager
async def lifespan(app: FastAPI):
# Automatically create database tables on startup (for quickstarts/dev)
await adapter.create_all()
yield
# 2. Mount all auth & account endpoints in one line
app = FastAPI(title="My API", lifespan=lifespan)
app.include_router(accounts.router, prefix="/api/v1/auth", tags=["Auth"])
# 3. Protect any endpoint with clean dependency injection
@app.get("/api/v1/profile")
async def get_profile(user = Depends(accounts.current_active_user)):
return {"message": f"Welcome back, {user.primary_email}!", "user_id": user.id}
Run your app:
uvicorn app:app --reload
Visit http://localhost:8000/docs to see your fully documented authentication endpoints:
POST /api/v1/auth/registerPOST /api/v1/auth/verify-emailPOST /api/v1/auth/request-verify-emailPOST /api/v1/auth/request-password-resetPOST /api/v1/auth/reset-passwordPOST /api/v1/auth/change-passwordPOST /api/v1/auth/loginPOST /api/v1/auth/logoutGET /api/v1/auth/me
🗺️ Roadmap & Milestones
| Milestone | Target Capabilities | Status |
|---|---|---|
| v0.1.0-alpha | Email/Password (Argon2id), Email verification, Timed HMAC tokens, Async SQLAlchemy 2.0, Dual-transport (Cookies + Bearer), Password reset & recovery, Authenticated password change | ✅ Completed |
| v0.2.0 (Multi-Email & DB Matrix) | Secondary email addition/verification/removal, Primary email promotion, PostgreSQL & MySQL integration tests | 🎯 Next Sprint |
| v0.3.0 (Social Accounts) | Google OAuth2/OIDC integration, Safe social account linking with anti-takeover verification | 📋 Planned |
| Future Horizons | Additional OAuth providers (GitHub, Apple), Active session device management, TOTP / MFA, WebAuthn Passkeys | 💡 Under RFC |
🧪 Running Tests
FastAPI Accounts comes with an automated test suite:
# Clone the repository
git clone https://github.com/fastapi-accounts/fastapi-accounts.git
cd fastapi-accounts
# Run tests with uv
uv run --all-extras pytest
💬 Join the Community & RFC
We are actively designing the OAuth linking and Passkey architecture:
- 💡 Have feedback or ideas? Join our GitHub Discussions.
- 🐛 Found a bug or missing feature? Open an Issue.
- ⭐ Support the project: Star this repository on GitHub!
📄 License
FastAPI Accounts is open-source software licensed under the Apache License 2.0.
Metadata
Release files for fastapi-accounts 0.1.0a2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fastapi_accounts-0.1.0a2.tar.gz | 957.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fastapi_accounts-0.1.0a2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 980.4 kB
Release files / fastapi_accounts-0.1.0a2.tar.gz
| Download URL | fastapi_accounts-0.1.0a2.tar.gz |
|---|---|
| Size | 957.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5a16159ba38e789311b8b0623a373c309536899f658c249ea35350db3a63eece
|
|
BLAKE2b-256 checksum How to use checksums |
8e74ea08b0d74011737c1c159f931a7e177f1a9df68f1f47d0f88fc2f6daa90c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.5
|
Release files / fastapi_accounts-0.1.0a2-py3-none-any.whl
| Download URL | fastapi_accounts-0.1.0a2-py3-none-any.whl |
|---|---|
| Size | 22.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c23ffb48c539d376f696ae45a06696dacdb6215e00c18d26221b587a8dc8f422
|
|
BLAKE2b-256 checksum How to use checksums |
3db2fe0ac6379a7789935483e7ffd90819420be753105ddc865da6b1627f0516
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.5
|