@gittielabs/nextjs-fastapi-auth (FastAPI)
Authentication and authorization library for FastAPI backends in Next.js + FastAPI applications with Supabase.
Installation
pip install gittielabs-nextjs-fastapi-auth
Features
- 🔐 Supabase JWT Validation - Validate and decode Supabase JWT tokens
- 👤 User Management - Extract user information from JWT tokens
- 🏢 Multi-Tenancy - Organization context from subdomains
- 🛡️ Admin Access Control - Role-based admin verification
- 🚀 FastAPI Integration - Easy dependency injection patterns
Quick Start
1. Supabase Authentication
from fastapi import FastAPI, Header, HTTPException
from gittielabs_fastapi_auth import SupabaseAuthService
app = FastAPI()
auth_service = SupabaseAuthService(
supabase_url="https://your-project.supabase.co",
supabase_service_key="your-service-role-key"
)
@app.get("/api/user/me")
async def get_current_user(authorization: str = Header(None)):
if not authorization:
raise HTTPException(status_code=401, detail="Authorization required")
token = auth_service.extract_token_from_header(authorization)
user = await auth_service.get_user_from_token(token)
if not user:
raise HTTPException(status_code=401, detail="Invalid token")
return user
2. Organization Context
from fastapi import Request
from gittielabs_fastapi_auth import get_organization_id_from_request
@app.get("/api/org/data")
async def get_org_data(request: Request):
# Extract organization ID from subdomain header or request state
org_id = get_organization_id_from_request(request)
# Use org_id to filter data...
return {"organization_id": org_id}
3. Admin Access Control
from fastapi import Request
from gittielabs_fastapi_auth import verify_admin_access, AdminRole
@app.get("/api/admin/users")
async def list_users(request: Request):
# Verify user has admin access
current_org, accessible_orgs, user = verify_admin_access(
request,
required_role=AdminRole.ORG_ADMIN
)
# User is verified as admin, proceed with operation
return {
"current_org": current_org,
"accessible_orgs": accessible_orgs,
"user_email": user.email
}
Core Components
Models
from gittielabs_fastapi_auth import AuthUser, UserRole, OrganizationInfo
# AuthUser - Authenticated user with organization context
user = AuthUser(
id="user-id",
email="user@example.com",
organization_id="org-id",
role=UserRole.ADMIN,
is_super_admin=False,
organizations=[{"id": "org-id", "name": "My Org", "role": "admin"}]
)
SupabaseAuthService
Handles JWT validation and user extraction:
service = SupabaseAuthService(
supabase_url="...",
supabase_service_key="..."
)
# Validate JWT token
is_valid, payload, error = await service.validate_jwt_token(token)
# Get user from token
user = await service.get_user_from_token(token)
# Extract token from header
token = service.extract_token_from_header("Bearer abc123...")
Organization Context
Extract organization context from requests:
from gittielabs_fastapi_auth import (
get_organization_id_from_request,
get_organization_id_from_request_optional,
extract_subdomain_from_request
)
# Required organization context (raises HTTPException if not found)
org_id = get_organization_id_from_request(request)
# Optional organization context (returns None if not found)
org_id = get_organization_id_from_request_optional(request)
# Extract subdomain from headers
subdomain = extract_subdomain_from_request(request)
Admin Access Control
Verify admin access and get organization context:
from gittielabs_fastapi_auth import (
verify_admin_access,
get_admin_organization_context,
check_organization_admin_access,
AdminRole
)
# Verify admin access (raises HTTPException if not admin)
current_org, accessible_orgs, user = verify_admin_access(
request,
required_role=AdminRole.ORG_ADMIN # or ORG_OWNER, ORG_BILLING
)
# Get comprehensive admin context
context = get_admin_organization_context(request)
# Returns: {
# "current_organization_id": "...",
# "accessible_organizations": ["...", "..."],
# "is_super_admin": False,
# "user_id": "...",
# "user_email": "..."
# }
# Check if user has admin access to specific org
has_access = check_organization_admin_access(request, "org-id")
User Roles
The library defines four user roles with different permission levels:
UserRole.VIEWER- Read-only accessUserRole.MEMBER- Standard member with read/write accessUserRole.ADMIN- Administrative access within organizationUserRole.OWNER- Full ownership and control
Super admins have access to all organizations regardless of role.
Development
Setup
# Install dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Format code
black .
# Lint
ruff check .
# Type check
mypy .
License
MIT © GittieLabs
Release files for gittielabs-nextjs-fastapi-auth 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 | |
|---|---|---|---|
| gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz | 19.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.0 kB
Release files / gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz
| Download URL | gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz |
|---|---|
| Size | 19.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8784bd0325d5ab94dd88d26caabc5387e2aeaa8118141be7578c65e544abcfb1
|
|
BLAKE2b-256 checksum How to use checksums |
98b73da600d2cf22ed770333d360b1bdd70ae98f34a7ce41c9a3d7e72ee9b69f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|
Release files / gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl
| Download URL | gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
15e95db05dcbcb44f1d700b8cebfe314755476da9773c9400cfdf41bd570b249
|
|
BLAKE2b-256 checksum How to use checksums |
90a31f30e927e45b3dbca4705f665033fae6b666a32951e9fe1cb588014a4d34
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|