A flexible and secure authentication library for FastAPI.
Project description
FastAPI MyAuth
A flexible and secure authentication library for FastAPI, designed to integrate seamlessly with your existing SQLModel ORM. FastAPI MyAuth provides robust features including:
- User Management: CRUD operations for users, including activation/deactivation.
- Authentication Methods:
- Traditional email/password login.
- Magic link based login for a passwordless experience.
- Refresh token mechanism for extended sessions without re-authenticating.
- Security Features:
- Password hashing with Argon2.
- JSON Web Token (JWT) based authentication.
- Two-Factor Authentication (TOTP) support.
- Password recovery flows.
- Email Integration: Templates and functions for sending various authentication-related emails (e.g., password reset, magic links).
- Role-Based Access Control (RBAC): Easily add roles to users and protect endpoints based on these roles.
- Extensible: Designed with generics to allow customization of the
Usermodel and integration with existing database sessions.
🚀 Getting Started
To quickly integrate FastAPI MyAuth into your FastAPI application, install it via pip:
pip install fastapi_myauth
Then, you can typically set up the authentication router in your FastAPI application like this:
from fastapi import FastAPI
from sqlmodel import Session, create_engine, SQLModel
from fastapi_myauth import models
from fastapi_myauth.auth import FastAuth
from fastapi_myauth.config import settings
app = FastAPI()
# Your database engine setup (example for SQLite)
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
# Dependency to get a database session
def get_db():
with Session(engine) as session:
yield session
# Initialize FastAuth with your custom User model (or use default)
# You can extend models.User, models.UserCreate, models.UserRead, models.UserUpdate
# to add custom fields. For example, if you want a `language` field:
class MyUser(models.User, table=True): # Important: table=True on your concrete user model
language: str = "en"
class MyUserRead(models.UserRead):
language: str
class MyUserCreate(models.UserCreate):
language: str | None = None
class MyUserUpdate(models.UserUpdate):
language: str | None = None
fast_auth = FastAuth(
get_db=get_db,
user_model=MyUser,
user_read=MyUserRead,
user_create=MyUserCreate,
user_update=MyUserUpdate,
)
# Call this once your app starts, e.g., in a startup event or directly
create_db_and_tables()
# Include the authentication router
app.include_router(fast_auth.get_router())
@app.on_event("startup")
def on_startup():
# Initialize the first superuser if not exists
with Session(engine) as session:
crud_user = fast_auth.crud_user()
user = crud_user.get_by_email(session, email=settings.FIRST_SUPERUSER)
if not user:
user_in = MyUserCreate(
email=settings.FIRST_SUPERUSER,
password=settings.FIRST_SUPERUSER_PASSWORD,
is_superuser=True,
language="en" # Set default for custom field
)
crud_user.create(session, obj_in=user_in)
# Example protected endpoint
from fastapi import Depends
from fastapi_myauth.api.deps import APIDependencies
# Get dependency instance from your fast_auth object
deps_instance = fast_auth.deps()
@app.get("/protected-route")
def read_protected_route(
current_user: MyUserRead = Depends(deps_instance.get_current_active_user)
):
return {"message": f"Hello, {current_user.email}! This is a protected route."}
For more detailed usage instructions, configuration options, and advanced customization, please refer to the Usage Documentation.
🌳 Project Structure
fastapi_myauth/
├── api/ # FastAPI routers and dependencies for REST API endpoints
│ ├── v1/ # Versioned API endpoints (e.g., login, users)
│ └── deps.py # FastAPI dependency injection for auth components
├── crud/ # CRUD operations for database models
│ ├── base.py # Generic CRUD base class
│ ├── crud_token.py # CRUD for refresh tokens
│ └── crud_user.py # CRUD for user operations
├── email/ # Email sending utilities and templates
├── models/ # Pydantic/SQLModel definitions for data structures
├── security.py # Password hashing, JWT handling, TOTP
├── config.py # Application settings
├── auth.py # Main FastAuth class for setup and router inclusion
└── test_main.py # Example FastAPI app for testing and demonstration
📚 Documentation
Detailed documentation is available in the docs directory:
- Usage Documentation: Learn how to install, configure, and use the
fastapi_myauthlibrary in your projects. - Development & Contributing: Information for developers interested in contributing to the project, including setup instructions and coding standards.
✨ Features at a Glance
- FastAPI Integration: Designed exclusively for FastAPI.
- SQLModel Native: Works seamlessly with SQLModel for ORM operations.
- Secure Authentication: Built with modern security practices (Argon2 for passwords, JWTs).
- Email Management: Integrated email sending for common auth flows.
- Customizable User Model: Easily extendable
Usermodel to fit specific application needs. - Dependency Injection: Leverages FastAPI's dependency injection system for robust and testable code.
🤝 Contributing
Contributions are welcome! Please see our Contributing Guide for details on how to get started.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
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_myauth-1.3.2.tar.gz.
File metadata
- Download URL: fastapi_myauth-1.3.2.tar.gz
- Upload date:
- Size: 106.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
891501d43fab52068d103c9138b8506cb8b5a305c6b4dc4b2492e40f1f8b94a9
|
|
| MD5 |
cd3c5dd77a52026e34e6a637531b8e12
|
|
| BLAKE2b-256 |
25f24497b9f0e11f7119fd8472fc74d2924a4a86671f9c83f657660cdd7407b2
|
Provenance
The following attestation bundles were made for fastapi_myauth-1.3.2.tar.gz:
Publisher:
cd.yml on zonistefano/fastapi_auth
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastapi_myauth-1.3.2.tar.gz -
Subject digest:
891501d43fab52068d103c9138b8506cb8b5a305c6b4dc4b2492e40f1f8b94a9 - Sigstore transparency entry: 418227165
- Sigstore integration time:
-
Permalink:
zonistefano/fastapi_auth@72da28316699d72f112d827c33dc77cda036d7a9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/zonistefano
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
cd.yml@72da28316699d72f112d827c33dc77cda036d7a9 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file fastapi_myauth-1.3.2-py3-none-any.whl.
File metadata
- Download URL: fastapi_myauth-1.3.2-py3-none-any.whl
- Upload date:
- Size: 39.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e55f3e651fd625a2b8480ceed9b444f4d100355989fa25a39a512ff8b2baddb9
|
|
| MD5 |
7faf40e141e1e41cfaada6d1e6dbdc41
|
|
| BLAKE2b-256 |
b1a4537052daf7ce3bbbc5866a86bc688d96b2b1d3960d3e6ccd199bc2af8758
|
Provenance
The following attestation bundles were made for fastapi_myauth-1.3.2-py3-none-any.whl:
Publisher:
cd.yml on zonistefano/fastapi_auth
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastapi_myauth-1.3.2-py3-none-any.whl -
Subject digest:
e55f3e651fd625a2b8480ceed9b444f4d100355989fa25a39a512ff8b2baddb9 - Sigstore transparency entry: 418227175
- Sigstore integration time:
-
Permalink:
zonistefano/fastapi_auth@72da28316699d72f112d827c33dc77cda036d7a9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/zonistefano
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
cd.yml@72da28316699d72f112d827c33dc77cda036d7a9 -
Trigger Event:
workflow_dispatch
-
Statement type: