Authentication and authorization library for Next.js + FastAPI applications with Supabase
Project description
@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
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 gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz.
File metadata
- Download URL: gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz
- Upload date:
- Size: 19.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8784bd0325d5ab94dd88d26caabc5387e2aeaa8118141be7578c65e544abcfb1
|
|
| MD5 |
c28158ac9c6d9a5b59f53fd60a205d98
|
|
| BLAKE2b-256 |
98b73da600d2cf22ed770333d360b1bdd70ae98f34a7ce41c9a3d7e72ee9b69f
|
File details
Details for the file gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl.
File metadata
- Download URL: gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15e95db05dcbcb44f1d700b8cebfe314755476da9773c9400cfdf41bd570b249
|
|
| MD5 |
9448ebe2cbc12339fae0254261357d69
|
|
| BLAKE2b-256 |
90a31f30e927e45b3dbca4705f665033fae6b666a32951e9fe1cb588014a4d34
|