A production-ready authentication library for Flask and FastAPI applications using Keycloak with SQLite database synchronization.
# Example usage
from fastapi import FastAPI, Depends
from keycloak_auth.fastapi_integration import get_current_user
app = FastAPI()
@app.get("/protected")
async def protected_route(user: dict = Depends(get_current_user)):
return {"user_id": user["id"]}- Features
- Installation
- Configuration
- Usage
- Database Schema
- Error Handling
- Security
- Deployment
- Troubleshooting
- ✅ Keycloak JWT authentication
- ✅ Role-based access control (RBAC)
- ✅ SQLite/PostgreSQL support
- ✅ Flask & FastAPI integration
- ✅ Automatic user synchronization
- ✅ Token validation with JWKS
- ✅ Production-ready security
- ✅ Custom exception hierarchy
# Using pip
pip install keycloak-auth-library
# Development setup
git clone https://github.com/yourusername/keycloak-auth-library.git
cd keycloak-auth-library
pip install -e .Create .env file:
KEYCLOAK_SERVER_URL=http://localhost:8080
KEYCLOAK_REALM=master
KEYCLOAK_CLIENT_ID=your-client
KEYCLOAK_CLIENT_SECRET=your-secret
DATABASE_URL=sqlite:///auth.dbfrom flask import Flask, g
from keycloak_auth.flask_integration import keycloak_auth
app = Flask(__name__)
@app.route("/protected")
@keycloak_auth(required_roles=["admin"])
def protected_route():
return {"user": g.user["id"]}from fastapi import FastAPI, Depends
from keycloak_auth.fastapi_integration import get_current_user
app = FastAPI()
@app.get("/protected")
async def protected_route(user: dict = Depends(get_current_user)):
return {"user": user["id"]}CREATE TABLE users (
id TEXT PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE NOT NULL
);
CREATE TABLE user_roles (
user_id TEXT REFERENCES users(id),
role TEXT NOT NULL
);try:
# Authentication code
except AuthenticationError as e:
# Handle 401 errors
except InsufficientPermissionsError:
# Handle 403 errors| Code | Error Class | Description |
|---|---|---|
| 401 | InvalidTokenError |
Invalid/missing JWT |
| 403 | InsufficientPermissions |
Missing required roles |
| 500 | ConfigurationError |
Invalid setup |
- Use HTTPS in production
- Rotate secrets every 90 days
- Enable Keycloak brute-force protection
- Set token expiration ≤ 1 hour
- Use database encryption
- Regular security audits
# docker-compose.yml
version: '3.8'
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: change-me
app:
build: .
environment:
KEYCLOAK_SERVER_URL: http://keycloak:8080
depends_on:
- keycloakProblem: ImportError: cannot import name...
✅ Verify package installation
✅ Check for naming conflicts
Problem: InvalidTokenError
✅ Validate Keycloak configuration
✅ Check token expiration
Problem: Roles not syncing
✅ Verify database permissions
✅ Check Keycloak role mappings
MIT License - See LICENSE for details.