Skip to main content

A reusable FastAPI router for API key management

Project description

API Key Management Library

Python Versions License: MIT Tests Coverage Code Quality PyPI version

A library for API key management and JWT validation, designed to be integrated into services that need to handle API key operations and authentication.

Overview

This library provides:

  • API key model and persistence
  • API key generation and validation
  • JWT validation
  • Key management endpoints
  • Database access layer

Installation

pip install beanone-apikey

Quick Start

from fastapi import FastAPI
from apikey import api_key_router

app = FastAPI()
app.include_router(api_key_router)

Features

  • API key generation and management
  • API key validation
  • JWT validation
  • API key listing and deletion
  • Secure key storage with hashing
  • Async database operations
  • FastAPI integration

API Endpoints

Endpoint Method Description
/api-keys/ POST Create a new API key
/api-keys/ GET List all API keys
/api-keys/{key_id} DELETE Delete an API key

Authentication

The library supports two authentication methods:

  1. JWT Authentication

    • Validates JWTs issued by the login service
    • Extracts user information from JWT claims
    • Supports audience validation
  2. API Key Authentication

    • Validates API keys in requests
    • Supports both header and query parameter authentication
    • Checks key status and expiration

Configuration

Environment variables:

  • DATABASE_URL: Database connection URL (default: sqlite+aiosqlite:///./apikey.db)
    • For development: sqlite+aiosqlite:///./apikey.db
    • For production: postgresql+asyncpg://user:password@host:5432/dbname
  • JWT_SECRET: Secret for JWT validation
  • JWT_ALGORITHM: JWT algorithm (default: HS256)
  • LOGIN_URL: Login service URL (default: http://localhost:8001)

Database Configuration

  • For development: SQLite (default)
  • For production: PostgreSQL
    • Use the full connection URL in DATABASE_URL
    • Example: postgresql+asyncpg://postgres:password@localhost:5432/apikeydb

Development

  1. Clone the repository
  2. Install development dependencies:
    pip install -e ".[dev]"
    
  3. Run tests:
    pytest
    

Starting a New Development Instance

  1. Set up the environment

    # Create and activate virtual environment
    python -m venv .venv
    source .venv/bin/activate  # On Windows: .venv\Scripts\activate
    
    # Install dependencies
    pip install -r requirements.txt
    pip install -r requirements-test.txt
    
  2. Configure environment variables Create a .env file in the project root:

    # Database configuration
    # For local deployment only
    DATABASE_URL=sqlite+aiosqlite:///./apikey.db
    # DATABASE_URL=postgresql+asyncpg://postgres:password@localhost:5433/apikeydb  # For PostgreSQL with Docker
    
    # JWT configuration: should match that of the Login service
    JWT_SECRET=supersecretjwtkey
    JWT_ALGORITHM=HS256
    LOGIN_URL=http://localhost:8001
    
  3. Start the development server

    # Using uvicorn directly
    uvicorn src.apikey.service:app --reload --port 8002
    
    # Or using Docker Compose for development
    docker compose -f docker-compose.dev.yml build --no-cache
    docker compose -f docker-compose.dev.yml up
    
  4. Verify the setup

    • Check the health endpoint: http://localhost:8002/health
    • Access the API documentation: http://localhost:8002/docs
    • Run the test suite: pytest
  5. Development workflow

    • The server will automatically reload on code changes
    • Use the API documentation to test endpoints
    • Check logs: docker-compose -f docker-compose.dev.yml logs -f apikey

Docker Deployment

Production Deployment

  1. Create a .env file with required environment variables
  2. Run with Docker Compose:
    docker-compose up -d
    

The service will be available at http://localhost:8002

Development Deployment

  1. Create a .env file with required environment variables
  2. Run with development Docker Compose:
    docker compose -f docker-compose.dev.yml up -d
    

Development features:

  • Hot reload enabled
  • Source code mounted for live updates
  • PostgreSQL database with persistent volume
  • Health checks configured

Docker Configuration

  • Service runs on port 8002
  • Health check endpoint: /health
  • Resource limits:
    • CPU: 0.5 cores
    • Memory: 512MB
  • Logging: JSON format with rotation (10MB max, 3 files)

Architecture

This library is designed to be integrated into services that need to:

  • Manage API keys for their users
  • Validate incoming requests using either JWTs or API keys
  • Store and manage API key data

The library follows a distributed API key management pattern where:

  • Each service maintains its own API key database
  • API key validation is performed locally
  • JWT validation is performed against the login service

Security

  • API keys are hashed before storage
  • JWT validation includes audience checks
  • API key validation checks status and expiration
  • All endpoints require authentication
  • Database operations use parameterized queries
  • Non-root user in Docker container
  • Resource limits enforced
  • Health checks implemented

License

MIT

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

beanone_apikey-0.2.4.tar.gz (31.2 kB view details)

Uploaded Source

Built Distribution

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

beanone_apikey-0.2.4-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file beanone_apikey-0.2.4.tar.gz.

File metadata

  • Download URL: beanone_apikey-0.2.4.tar.gz
  • Upload date:
  • Size: 31.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for beanone_apikey-0.2.4.tar.gz
Algorithm Hash digest
SHA256 5293d8e657412bba9dc8ed8b1aaf44d0088ae0092d4907260a5056c75d54ea1a
MD5 69199045ab495021efb00899a9863dc9
BLAKE2b-256 f97063a3577ccb76f341a2a3d1514f80936866979f026c63042b212d30ec5288

See more details on using hashes here.

Provenance

The following attestation bundles were made for beanone_apikey-0.2.4.tar.gz:

Publisher: publish.yml on beanone/apikey

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file beanone_apikey-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: beanone_apikey-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for beanone_apikey-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 73be9b2cc29160e44a9a3353b9cafdef9885e51e1fc2635a6ffd9e10dbe72b72
MD5 eae8eb09248e7253fde28fc13db1e748
BLAKE2b-256 2e28f0eea5b65ab3cddce4fa6eaa1522ed2f6bbd69d3ffe33921349b1aba6570

See more details on using hashes here.

Provenance

The following attestation bundles were made for beanone_apikey-0.2.4-py3-none-any.whl:

Publisher: publish.yml on beanone/apikey

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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