FastAPI authentication backend for Auth Kit
Project description
Auth Kit FastAPI
FastAPI authentication backend for Auth Kit. Provides a complete authentication solution with JWT tokens, passkeys, 2FA, and more.
Installation
pip install auth-kit-fastapi
Quick Start
from fastapi import FastAPI
from auth_kit_fastapi import create_auth_app, AuthConfig
app = FastAPI()
# Configure authentication
auth_config = AuthConfig(
database_url="postgresql://localhost/myapp",
jwt_secret="your-secret-key",
features={
"passkeys": True,
"two_factor": True,
"email_verification": True
}
)
# Create auth app
auth_app = create_auth_app(auth_config)
# Mount auth routes
app.mount("/api/auth", auth_app)
Features
- 🔐 JWT-based authentication with refresh tokens
- 🔑 WebAuthn/Passkey support
- 🔒 Two-factor authentication (TOTP)
- 📧 Email verification
- 🔄 Password reset flow
- 👤 User management
- 🗄️ SQLAlchemy ORM support
- 🔍 Extensible user model
- 🛡️ Security best practices
Configuration
from auth_kit_fastapi import AuthConfig
config = AuthConfig(
# Database
database_url="postgresql://user:pass@localhost/db",
# JWT Settings
jwt_secret="your-secret-key",
jwt_algorithm="HS256",
access_token_expire_minutes=30,
refresh_token_expire_days=7,
# Passkey Settings
passkey_rp_id="localhost",
passkey_rp_name="My App",
passkey_origin="http://localhost:3000",
# Email Settings
email_from="noreply@example.com",
email_from_name="My App",
# Features
features={
"passkeys": True,
"two_factor": True,
"email_verification": True,
"social_login": ["google", "github"]
}
)
Custom User Model
Extend the base User model with your own fields:
from auth_kit_fastapi import BaseUser
from sqlalchemy import Column, String
class User(BaseUser):
__tablename__ = "users"
# Add custom fields
company_name = Column(String, nullable=True)
department = Column(String, nullable=True)
API Endpoints
All endpoints are mounted under your chosen prefix (e.g., /api/auth):
Authentication
POST /register- Register new userPOST /login- Login with email/passwordPOST /logout- Logout userPOST /refresh- Refresh access tokenGET /me- Get current user
Password Management
POST /password/change- Change passwordPOST /password/reset- Request password resetPOST /password/reset/confirm- Confirm password reset
Email Verification
GET /verify-email/{token}- Verify emailPOST /resend-verification- Resend verification email
Passkeys
GET /passkeys- List user's passkeysPOST /passkeys/register/begin- Begin passkey registrationPOST /passkeys/register/complete- Complete passkey registrationPOST /passkeys/authenticate/begin- Begin passkey authenticationPOST /passkeys/authenticate/complete- Complete passkey authenticationDELETE /passkeys/{id}- Delete passkey
Two-Factor Authentication
POST /2fa/setup/begin- Begin 2FA setupPOST /2fa/setup/verify- Verify and enable 2FAPOST /2fa/disable- Disable 2FAPOST /2fa/verify/login- Verify 2FA during loginPOST /2fa/recovery-codes- Regenerate recovery codes
Middleware & Dependencies
Use the provided dependencies to protect your routes:
from fastapi import Depends
from auth_kit_fastapi import get_current_user, require_verified_user
@app.get("/protected")
async def protected_route(user = Depends(get_current_user)):
return {"message": f"Hello {user.email}"}
@app.get("/verified-only")
async def verified_only(user = Depends(require_verified_user)):
return {"message": "Only verified users can see this"}
Events & Hooks
Subscribe to authentication events:
from auth_kit_fastapi import auth_events
@auth_events.on("user_registered")
async def on_user_registered(user):
# Send welcome email
print(f"New user registered: {user.email}")
@auth_events.on("user_logged_in")
async def on_user_logged_in(user):
# Log login event
print(f"User logged in: {user.email}")
Changelog
Version 0.3.16 (2025-01-09)
- Fixed: Complete passkey authentication flow with proxy/API gateway setups
- Resolved FastAPI
redirect_slashesconflicts causing redirect loops in proxy environments - Added duplicate routes without trailing slashes for passkey endpoints
- Fixed authentication flow to properly handle passkey login without password fallback
- Improved frontend integration with proper Content-Type handling for form-encoded data
- Enhanced debug logging for troubleshooting authentication issues
- Resolved FastAPI
Version 0.3.3 (2025-01-07)
- Fixed: Base64url decoding for passkey challenges
- Properly handles base64url encoded challenges (with
-and_characters) - Fixes 400 errors when challenges are sent in base64url format from frontend
- Properly handles base64url encoded challenges (with
Version 0.3.2 (2025-01-07)
- Fixed: Passkey challenge handling for proxy/CORS scenarios
- Challenges can now be provided in the request body as a fallback when session cookies aren't maintained
- Fixes "Registration session expired" errors in environments with proxy setups (e.g., Next.js, Vercel)
- Maintains backward compatibility with session-based challenge storage
Version 0.3.1
- Initial public release with full authentication features
Troubleshooting
Passkey Authentication Issues
Redirect Loops with Proxy/API Gateway
If you're experiencing redirect loops (ERR_TOO_MANY_REDIRECTS) when using passkeys through a proxy:
Problem: FastAPI's redirect_slashes=True (default) conflicts with proxy setups, causing infinite redirects.
Solution:
app = FastAPI(redirect_slashes=False)
Frontend Integration with Next.js/Vercel
When using with Next.js or similar frameworks that proxy API requests:
- Preserve trailing slashes in proxy config:
// next.config.js
rewrites: async () => [
{
source: '/api/:path*/',
destination: 'http://backend:8000/api/:path*/'
},
{
source: '/api/:path*',
destination: 'http://backend:8000/api/:path*'
}
]
- Handle form-encoded data properly in axios:
// Don't override Content-Type for URLSearchParams
if (!(config.data instanceof FormData) &&
!(config.data instanceof URLSearchParams)) {
config.headers['Content-Type'] = 'application/json';
}
"Credential not found" Errors
This usually means the passkey authentication succeeded but the frontend is incorrectly trying to perform a regular login afterwards. Ensure your frontend directly fetches user data after successful passkey verification instead of calling the login endpoint.
License
MIT License
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 auth-kit-fastapi-0.3.19.tar.gz.
File metadata
- Download URL: auth-kit-fastapi-0.3.19.tar.gz
- Upload date:
- Size: 42.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ee4dea76185ee4a2b225a692f4c4c060e01d0d847e47d2b180673be0e59f8e0
|
|
| MD5 |
284a5c5a3b4aba719642fdb7a0a7ffc2
|
|
| BLAKE2b-256 |
6f8f0acd3f0ebc27160afba0c2ee093947680ddc86ca18cc9d59eb36a1102bd9
|
File details
Details for the file auth_kit_fastapi-0.3.19-py3-none-any.whl.
File metadata
- Download URL: auth_kit_fastapi-0.3.19-py3-none-any.whl
- Upload date:
- Size: 52.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6379a3c0973681471b7deab91cc034990a791fd02e64698e0ed8f0cbc85c827
|
|
| MD5 |
2ba33e59e0debc7acbf05d502c2f5d18
|
|
| BLAKE2b-256 |
169619c73de72c605a0933cc1ca3709a195111bc92de79723630ffeba59b34e0
|