Skip to main content

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 access
  • UserRole.MEMBER - Standard member with read/write access
  • UserRole.ADMIN - Administrative access within organization
  • UserRole.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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz (19.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz.

File metadata

File hashes

Hashes for gittielabs_nextjs_fastapi_auth-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8784bd0325d5ab94dd88d26caabc5387e2aeaa8118141be7578c65e544abcfb1
MD5 c28158ac9c6d9a5b59f53fd60a205d98
BLAKE2b-256 98b73da600d2cf22ed770333d360b1bdd70ae98f34a7ce41c9a3d7e72ee9b69f

See more details on using hashes here.

File details

Details for the file gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for gittielabs_nextjs_fastapi_auth-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 15e95db05dcbcb44f1d700b8cebfe314755476da9773c9400cfdf41bd570b249
MD5 9448ebe2cbc12339fae0254261357d69
BLAKE2b-256 90a31f30e927e45b3dbca4705f665033fae6b666a32951e9fe1cb588014a4d34

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page