FastAPI Auth Middleware
A simple and powerful authentication middleware for FastAPI applications with JWT and role-based access control.
Features
- JWT-based authentication
- Token generation, verification, and refresh
- Zero-query authentication for protected routes
- Role-based access control
- Easily customizable token extraction
Installation
pip install fastauth
or with poetry
poetry add fastauth
Quick Start
from fastapi import FastAPI, Depends, HTTPException
from fastauth import (
register_auth_middleware,
setup_token_manager,
require_auth,
require_role,
generate_token,
User
)
app = FastAPI()
# Setup token manager
setup_token_manager(
secret_key="your_secret_key",
algorithm="HS256",
access_token_expire_minutes=30,
refresh_token_expire_days=7
)
# register auth middleware
register_auth_middleware(
app,
exclude_paths=["/public", "/login"],
token_getter=None # Optional custom token getter
)
# generate token
tokens = generate_token(User(
id="user123",
username="admin",
roles=["admin"]
))
# Example login endpoint
@app.post("/login")
async def login(username: str, password: str):
# Your authentication logic here
# ...
# If authentication successful, create a user object
user = User(
id="user123",
username=username,
roles=["user"] # Assign roles as needed
)
# Generate tokens
tokens = generate_token(user)
return tokens
# Protected route
@app.get("/protected")
async def protected_route(user_data = Depends(require_auth())):
return {"message": "This is a protected route", "user_id": user_data.user_id}
# Protected route with role-based access control
@app.get("/admin")
async def admin_route(user_data = Depends(require_role(["admin"]))):
return {"message": "Admin access granted", "user_id": user_data.user_id}
# Route that requires multiple roles (all of them)
@app.get("/super-admin")
async def super_admin_route(user_data = Depends(require_role(["admin", "super"], require_all=True))):
return {"message": "Super admin access granted", "user_id": user_data.user_id}
# Public route
@app.get("/public")
async def public_route():
return {"message": "This is a public route"}
Advanced Usage
Custom Token Extraction
You can customize how tokens are extracted from requests:
def custom_token_getter(request):
# Your custom logic here
return request.headers.get("X-Custom-Token")
# register auth middleware
register_auth_middleware(app, token_getter=custom_token_getter)
Refresh Tokens
from fastauth import refresh_token
@app.post("/refresh-token")
async def refresh_tokens(refresh_token_str: str, user_id: str):
# Get user from your database
user = get_user_from_db(user_id)
# Create User object from your user model
auth_user = User(
id=user.id,
username=user.username,
roles=user.roles
)
# Refresh the tokens
new_tokens = refresh_token(refresh_token_str, auth_user)
return new_tokens
Token Revocation
from fastauth import revoke_token, revoke_all_user_tokens
@app.post("/logout")
async def logout(token: str, user_data = Depends(require_auth())):
# Revoke the current token
revoke_token(token)
return {"message": "Logged out successfully"}
@app.post("/logout-all-devices")
async def logout_all_devices(user_data = Depends(require_auth())):
# Revoke all tokens for this user
revoke_all_user_tokens(user_data.user_id)
return {"message": "Logged out from all devices"}
CSRF Protection
from fastapi import Depends, Cookie, Response
from fastauth import generate_csrf_token, csrf_protection
# Apply CSRF protection middleware to all routes
app.middleware("http")(csrf_protection())
@app.post("/login")
async def login(username: str, password: str, response: Response):
# Your authentication logic
# ...
# Generate tokens
user = User(id="user123", username=username, roles=["user"])
tokens = generate_token(user)
# Generate CSRF token
csrf_token = generate_csrf_token(user.id)
# Set CSRF token as cookie
response.set_cookie(
key="csrf_token",
value=csrf_token,
httponly=True,
samesite="strict",
secure=True # For HTTPS
)
return tokens
# Protected route with CSRF protection
@app.post("/update-profile", dependencies=[Depends(csrf_protection())])
async def update_profile(data: dict, user_data = Depends(require_auth())):
# This route is protected by both authentication and CSRF protection
return {"message": "Profile updated"}
Redis Backend
FastAuth can use Redis for token storage, which is recommended for production environments:
from fastauth import setup_token_manager
# Setup with Redis
setup_token_manager(
secret_key="your_secret_key",
algorithm="HS256",
redis_url="redis://localhost:6379/0" # Will use Redis if available
)
Token Rotation
For enhanced security, you can force token rotation which invalidates all previous tokens:
from fastauth import rotate_user_tokens
@app.post("/security/rotate-tokens")
async def rotate_tokens(user = Depends(require_auth())):
# Get user from your database
db_user = get_user_from_db(user.user_id)
# Create User object
auth_user = User(
id=db_user.id,
username=db_user.username,
roles=db_user.roles
)
# Rotate tokens
new_tokens = rotate_user_tokens(auth_user)
return new_tokens
Periodic Token Cleanup
Set up automatic cleanup of expired tokens:
from fastapi import FastAPI
from fastauth import setup_token_manager
from fastauth.tasks import setup_periodic_tasks
app = FastAPI()
# Setup token manager
setup_token_manager(
secret_key="your_secret_key",
algorithm="HS256"
)
# Setup token cleanup every hour (3600 seconds)
setup_periodic_tasks(app, cleanup_interval_seconds=3600)
License
MIT
Metadata
Release files for fast-guardian 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| fast_guardian-0.1.0.tar.gz | 12.2 kB | Without provenance | Details for fast_guardian-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| fast_guardian-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for fast_guardian-0.1.0-py3-none-any.whl |
Total release size: 25.7 kB
Release files / fast_guardian-0.1.0.tar.gz
| Download URL | fast_guardian-0.1.0.tar.gz |
|---|---|
| Size | 12.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
883bc886405a85f1ea09e0b9ed13f56d958741d6b73ae22a2f3a04195a754bed
|
|
BLAKE2b-256 checksum How to use checksums |
e46991259c094315176d3d62bf5d9b71e7de6dbb3e401c3479b293baeacaa065
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.0.1 CPython/3.12.10 Linux/6.11.0-1012-azure
|
Release files / fast_guardian-0.1.0-py3-none-any.whl
| Download URL | fast_guardian-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c9cadd9a45452f3ed1a0fd92c7a431850928030281ac77bcdf101a5f88dcae0d
|
|
BLAKE2b-256 checksum How to use checksums |
c7fe7138ec78c70a952f0dbc50ea32bf1a6d4a23b03cc31095c24370fa7318f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.0.1 CPython/3.12.10 Linux/6.11.0-1012-azure
|
Security for fast-guardian 0.1.0
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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.