A robust client for interacting with the Auth API service
Project description
API Key Management Module
This module provides a standalone service for API key management, including:
- API key generation
- API key listing
- API key revocation
- API key usage statistics
Features
- Secure API Key Generation: Creates cryptographically secure API keys with the format
permas_[environment]_[random] - Environment Support: Supports both
testandliveenvironments - Scoped Access: API keys can be scoped to specific permissions
- IP Restrictions: Optional IP address restrictions for enhanced security
- Usage Tracking: Tracks API key usage including request counts, endpoints, and status codes
- Revocation: Ability to revoke API keys with reason tracking
Directory Structure
auth/api_keys/
├── __init__.py # Module initialization
├── README.md # This file
├── example.py # Example FastAPI app
├── models/ # Data models
│ └── __init__.py # Model definitions
├── routers/ # API routes
│ └── api_keys.py # API key endpoints
└── services/ # Business logic
├── api_key_service.py # API key service
└── token_service.py # Token service
API Endpoints
| Method | Endpoint | Description |
|---|---|---|
| POST | /auth/keys/generate | Generate a new API key |
| GET | /auth/keys | List all API keys for a provider |
| POST | /auth/keys/{token_id}/revoke | Revoke an API key |
| GET | /auth/keys/{token_id}/usage | Get usage statistics for an API key |
| POST | /auth/keys/batch/usage | [Planned] Batch update usage statistics |
System Architecture
Database Layer
- Primary: Azure Cosmos DB
- Fallback: SQLite
- Sync Strategy: Eventual consistency with background sync
Concurrency Handling
-
Database Transaction Locks
- Row-level locking for usage updates
- Optimistic concurrency control for Cosmos DB
- Pessimistic locking for SQLite operations
-
Batch Processing
- Batch size configuration via environment variables
- Automatic batching for high-volume updates
- Asynchronous processing with status tracking
-
Rate Limiting
- Per-endpoint rate limits
- Provider-based quotas
- Circuit breaker pattern for external services
- Configurable cooldown periods
Error Handling
-
Retry Mechanisms
- Exponential backoff
- Circuit breaker pattern
- Fallback strategies
-
Error Categories
- Transient failures (retry-able)
- Permanent failures (non-retry-able)
- Resource exhaustion
- Validation errors
Configuration
Environment Variables
# Database Configuration
AZURE_COSMODB_CONNECTION_STRING=your_connection_string
AZURE_COSMODB_DATABASE=api_keys
DB_FALLBACK=true
DB_PATH=/data/api_keys.db
# Performance Tuning
COSMOS_RU_LIMIT=400
COSMOS_BATCH_SIZE=100
MAX_CONCURRENT_REQUESTS=50
BATCH_PROCESSING_INTERVAL=5
# Rate Limiting
RATE_LIMIT_WINDOW=60
RATE_LIMIT_MAX_REQUESTS=1000
RATE_LIMIT_STRATEGY=sliding_window
# Error Handling
MAX_RETRIES=3
RETRY_BACKOFF_MS=1000
CIRCUIT_BREAKER_TIMEOUT=30
Scaling Considerations
Horizontal Scaling
- Stateless API design
- Distributed rate limiting
- Cache-friendly architecture
Vertical Scaling
- Configurable batch sizes
- Memory-optimized operations
- Connection pooling
Data Consistency
- Eventually consistent model
- Background sync processes
- Conflict resolution strategies
Monitoring and Observability
Metrics
- Request rates
- Error rates
- Response times
- Resource utilization
Health Checks
- Database connectivity
- Service status
- Resource availability
Development Guidelines
Adding New Endpoints
- Implement rate limiting
- Add concurrency controls
- Include batch processing support
- Document error scenarios
Testing Requirements
- Concurrency tests
- Load tests
- Failure scenario tests
- Integration tests
Usage
Integration with FastAPI
from fastapi import FastAPI
from auth.api_keys.routers import api_keys
app = FastAPI()
app.include_router(api_keys.router, prefix="/auth")
API Key Generation
from auth.api_keys.services.api_key_service import APIKeyService
async def generate_key():
service = APIKeyService()
await service.init()
token_data, raw_token = await service.create_api_key(
provider_id="provider123",
name="My API Key",
environment="test",
scopes=["api:access"],
expires_in_days=365,
description="My test API key",
ip_restrictions=["192.168.1.1"]
)
# Important: raw_token is only available at creation time
print(f"Your API key: {raw_token}")
return token_data
API Key Validation
from fastapi import Depends, HTTPException, Security
from fastapi.security.api_key import APIKeyHeader
from auth.api_keys.services.api_key_service import APIKeyService
api_key_header = APIKeyHeader(name="X-API-Key", auto_error=False)
async def get_api_key_service():
service = APIKeyService()
await service.init()
return service
async def get_api_key(
api_key: str = Security(api_key_header),
api_key_service: APIKeyService = Depends(get_api_key_service)
):
if not api_key:
raise HTTPException(status_code=401, detail="API key is required")
key_data = await api_key_service.validate_api_key(api_key)
if not key_data.get("valid"):
raise HTTPException(status_code=401, detail="Invalid API key")
return key_data
Database Integration
By default, the module uses an in-memory storage for development and testing. For production use, you should configure it to use a proper database:
from auth.api_keys.services.token_service import TokenService
from auth.api_keys.services.api_key_service import APIKeyService
# Initialize with your database client
db_client = YourDatabaseClient()
token_service = TokenService(db_client=db_client)
api_key_service = APIKeyService(token_service=token_service)
Running the Example
The module includes an example FastAPI application that demonstrates how to use the API key management functionality:
# From the project root
python -m auth.api_keys.example
Then visit http://localhost:8000/docs to interact with the API through the Swagger UI.
API Keys Service
This directory contains the API Keys service with SAS token generation for Azure Table Storage.
Features
- API key generation, storage, and validation
- SAS token generation for Azure Table Storage with rate limiting
- Deployment scripts for Azure Container Registry (ACR)
- Kubernetes deployment manifests
Development Setup
Prerequisites
- Python 3.11+
- Azure Storage Account
- Docker (for deployment)
- Kubernetes cluster (for deployment)
Local Development
- Create and activate a virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
- Install dependencies:
pip install -r requirements.txt
- Set up environment variables:
export AZURE_STORAGE_CONNECTION_STRING="your_connection_string"
export RATE_LIMIT_REQUESTS=100 # Optional
export RATE_LIMIT_WINDOW_MS=60000 # Optional
- Run tests:
pytest
Deployment
Pre-Deployment Checks
Run the pre-deployment checks to ensure your environment is properly configured:
chmod +x check_deployment.sh
./check_deployment.sh
This script checks:
- Docker installation and daemon status
- Required files existence
- Azure CLI installation and login status
- ACR access
- Kubernetes configuration
- Python package structure
Deploying to ACR
Use the prepare_build.sh script to prepare and deploy the service:
chmod +x prepare_build.sh
./prepare_build.sh
This script:
- Runs the deployment checks
- Builds the Docker image with a date-based tag
- Pushes the image to ACR
- Deploys to Kubernetes using the deployment.yaml template
Manual Deployment
If you need more control over the deployment process, you can run the steps manually:
- Build the Docker image:
docker build -t auth/api-keys:latest -f Dockerfile.prod .
- Tag the image for ACR:
docker tag auth/api-keys:latest youracrname.azurecr.io/auth/api-keys:latest
- Push to ACR:
az acr login --name youracrname
docker push youracrname.azurecr.io/auth/api-keys:latest
- Deploy to Kubernetes:
kubectl apply -f k8s/auth/deployment.yaml
Configuration
Environment Variables
The service can be configured through the following environment variables:
| Variable | Description | Default |
|---|---|---|
| AZURE_STORAGE_CONNECTION_STRING | Connection string for Azure Storage | Required |
| RATE_LIMIT_REQUESTS | Maximum number of SAS token requests | 100 |
| RATE_LIMIT_WINDOW_MS | Time window for rate limiting in milliseconds | 60000 |
Kubernetes ConfigMap
The service uses a ConfigMap for configuration in Kubernetes. See k8s/auth/configmap.yaml for details.
Monitoring
After deployment, you can monitor the service using:
kubectl get pods -n auth-services
kubectl logs -f deployment/api-keys -n auth-services
Troubleshooting
If you encounter issues with the deployment:
- Check the logs:
kubectl logs -f deployment/api-keys -n auth-services
- Check the deployment status:
kubectl describe deployment api-keys -n auth-services
- Check the pod status:
kubectl describe pods -l app=api-keys -n auth-services
License
Copyright © 2023 Perceptive Focus. All rights reserved.
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_api_client-1.0.1.tar.gz.
File metadata
- Download URL: auth_api_client-1.0.1.tar.gz
- Upload date:
- Size: 50.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
562fd648514b3039235166ea0769700f74080126230d9ee8e6e72d6a9ed91237
|
|
| MD5 |
58a9cf47a9c3573bbf5818dfdd332a84
|
|
| BLAKE2b-256 |
3b71e75fdc1c6cbb14704139cbb091fcb78f6c73c2d29cc15b2a922b4b9b2cbc
|
File details
Details for the file auth_api_client-1.0.1-py3-none-any.whl.
File metadata
- Download URL: auth_api_client-1.0.1-py3-none-any.whl
- Upload date:
- Size: 63.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c113f3389b15296636330fe6d07d2012f9842dc71c5a8029103a7f3a1e6b2ea
|
|
| MD5 |
91b3a837992533b66fc582c03e7e66f7
|
|
| BLAKE2b-256 |
e3661a3e8064015b41c45b1d0e64af779d450375cd2bda2449584a939939e5dc
|