A modular authentication system for FastAPI with OAuth2, JWT, and password recovery
Project description
fastapi-authly
A modular authentication system for FastAPI applications. Provides complete user authentication with OAuth2, JWT tokens, password recovery, and more.
โจ Features
- ๐ OAuth2 Password Flow - Standard OAuth2 authentication
- ๐ซ JWT Token Management - Secure token creation and validation
- ๐ Password Recovery - Email-based password reset
- ๐ค User Management - Registration, profile management
- ๐ง Email Verification - User email verification system
- ๐ Token Refresh - Refresh token functionality
- ๐งฉ Modular Design - Easy to integrate and configure
- ๐ก๏ธ Security First - Built with security best practices
- ๐ Type Hints - Full type annotation support
๐ Quick Start (Tortoise + Postgres ้ป่ฎคๅฎ็ฐ)
Installation
uv pip install fastapi-authly
# or
pip install fastapi-authly
Minimal FastAPI App (uses default TortoiseUserRepository)
from fastapi import FastAPI
from tortoise.contrib.fastapi import register_tortoise
from fastapi_authly import (
AuthConfig,
AuthDependencyConfig,
create_auth_router,
)
from fastapi_authly.contrib.tortoise_pg import TortoiseUserRepository
app = FastAPI()
# 1) init Tortoise (Postgres)
register_tortoise(
app,
db_url="postgres://user:password@localhost:5432/mydb",
modules={"models": ["fastapi_authly.models.user"]},
generate_schemas=True,
add_exception_handlers=True,
)
# 2) assemble auth router with default repo (can override via dependencies)
config = AuthConfig(token_url="login") # keep token_url aligned with /login route
deps = AuthDependencyConfig(user_repository=TortoiseUserRepository())
auth_router = create_auth_router(config=config, dependencies=deps)
app.include_router(auth_router)
# Optional: Setup Scalar API documentation (static resources included, no manual setup needed)
from fastapi_authly import setup_scalar_docs
setup_scalar_docs(app, docs_url="/docs", static_url="/static")
Advanced Usage (custom implementations)
from fastapi_authly import AuthConfig, AuthDependencyConfig, create_auth_router
from fastapi_authly.interfaces import UserRepository, Mailer
class MyRepo(UserRepository):
async def get_by_name(self, username: str): ...
async def get_by_id(self, user_id: str | int): ...
async def create_user(self, user): ...
async def to_public(self, user): ...
class MyMailer(Mailer):
async def send_password_reset(self, request, token): ...
async def send_verification(self, email, token): ...
config = AuthConfig(router_prefix="/api/auth", token_url="login")
deps = AuthDependencyConfig(
user_repository=MyRepo(),
mailer=MyMailer(),
)
auth_router = create_auth_router(config=config, dependencies=deps)
๐ API Documentation
fastapi-authly includes built-in Scalar API documentation support with all necessary static resources:
from fastapi import FastAPI
from fastapi_authly import setup_scalar_docs
app = FastAPI(title="My API")
# One line to enable Scalar documentation
# Automatically mounts static files to /static and creates docs page at /docs
setup_scalar_docs(app)
# Custom configuration
setup_scalar_docs(
app,
docs_url="/api-docs", # Custom docs URL
static_url="/assets", # Custom static files prefix
title="Custom API Docs", # Custom title
openapi_url="/openapi.json" # Custom OpenAPI schema URL
)
๐ API Endpoints
Authentication
POST /auth/login- Login and get access token (+optional refresh)POST /auth/token/verify- Verify token validityPOST /auth/token/refresh- Refresh access token
User Management
POST /auth/register- User registrationGET /auth/me- Get current user info
Password Management
POST /auth/password/reset-request- Request password resetPOST /auth/password/reset- Reset password with token
๐ง Configuration
AuthConfig Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
secret_key |
str |
"your-secret-key-change-in-production" |
JWT secret key |
algorithm |
str |
"HS256" |
JWT algorithm |
access_token_expire_minutes |
int |
30 |
Access token expiration |
refresh_token_expire_days |
int |
7 |
Refresh token expiration |
router_prefix |
str |
"/auth" |
API route prefix |
router_tags |
List[str] |
["authentication"] |
API tags |
token_url |
str |
"token" |
OAuth2 token path (set to "login" to match default route) |
enable_password_recovery |
bool |
True |
Enable password recovery |
enable_user_registration |
bool |
True |
Enable user registration |
enable_token_refresh |
bool |
True |
Enable token refresh |
enable_html_content |
bool |
True |
Allow HTML in responses |
email_from |
str |
"noreply@example.com" |
Email sender |
email_from_name |
str |
"Auth System" |
Email sender name |
password_reset_url_template |
str |
Template URL | Password reset URL |
verification_url_template |
str |
Template URL | Email verification URL |
๐๏ธ Architecture
fastapi_authly/
โโโ auth.py # Main authentication module (routes)
โโโ schemas/ # Pydantic schemas (request/response models)
โ โโโ user.py
โโโ models/ # DB models (e.g., Tortoise ORM)
โ โโโ user.py
โโโ contrib/
โ โโโ tortoise_pg.py # Default Tortoise Postgres repository
โโโ core/ # Core functionality
โ โโโ config.py # Settings & dependency container
โ โโโ security.py # Token + password utilities
โ โโโ __init__.py
โโโ interfaces.py # Protocols (UserRepository, Mailer, etc.)
โโโ __init__.py # Package exports
โโโ __about__.py # Version info
๐ Integration Examples
# FastAPI + Tortoise + Postgres (default repo)
from fastapi import FastAPI
from tortoise.contrib.fastapi import register_tortoise
from fastapi_authly import AuthConfig, AuthDependencyConfig, create_auth_router
from fastapi_authly.contrib.tortoise_pg import TortoiseUserRepository
app = FastAPI()
register_tortoise(
app,
db_url="postgres://user:password@localhost:5432/mydb",
modules={"models": ["fastapi_authly.models.user"]},
generate_schemas=True,
add_exception_handlers=True,
)
config = AuthConfig(token_url="login")
deps = AuthDependencyConfig(user_repository=TortoiseUserRepository())
app.include_router(create_auth_router(config=config, dependencies=deps))
๐ค Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
๐ License
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Acknowledgments
- FastAPI - The web framework
- Pydantic - Data validation
- python-jose - JWT implementation
- passlib - Password hashing
๐ Support
If you have any questions or need help:
- ๐ฌ GitHub Issues: Create an issue
- ๐ Documentation: Read the docs
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_authly-0.1.5.tar.gz.
File metadata
- Download URL: fastapi_authly-0.1.5.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"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":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e33e6f11483b8094dd1672b35f575fee807686a0649c6aa240713bc10e5aca17
|
|
| MD5 |
a06441f02c1816f9397643d1d4391d41
|
|
| BLAKE2b-256 |
e46e3930a2657c47841a7a47ee9b5cb654b819cfacde31907762cbe64d8f2e8c
|
File details
Details for the file fastapi_authly-0.1.5-py3-none-any.whl.
File metadata
- Download URL: fastapi_authly-0.1.5-py3-none-any.whl
- Upload date:
- Size: 1.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"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":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7976fb28e133fff3b2edec46ce1070045bcac64ee396d5e0d6c6e4a59e6cf045
|
|
| MD5 |
4ae372e8c8a84944b11ff7ba606be641
|
|
| BLAKE2b-256 |
9a9191916255c87086fe8bb785ebc88907981d480ba62e3726172de844705e18
|