Python SDK for the Authlib
Project description
AuthLib
A Python authentication library that provides JWT, OAuth2, and API token authentication with PostgreSQL backend. This library is designed for seamless integration with Flask applications and provides a robust set of endpoints and utilities for user management, authentication, and API token handling.
Table of Contents
- AuthLib
Installation
pip install -e .
Quick Start
from flask import Flask
from authlib import AuthManager
app = Flask(__name__)
# Option 1: Explicit configuration
auth = AuthManager(
app=app,
db_dsn="postgresql://user:pass@localhost/dbname",
jwt_secret="your-secret-key",
oauth_config={
"google": {
"client_id": "your-client-id",
"client_secret": "your-client-secret"
}
}
)
# Option 2: Use environment variables with a prefix (e.g., AMPA_)
# This will load:
# AMPA_DATABASE_URL, AMPA_JWT_SECRET, AMPA_GOOGLE_CLIENT_ID, AMPA_GOOGLE_CLIENT_SECRET
# auth = AuthManager(app=app, environment_prefix="AMPA")
@app.route("/protected")
@auth.require_auth(roles=["admin"])
def protected_route():
return "Protected content"
@app.route("/public")
@auth.public_endpoint
def custom_public_route():
return "Public content"
AuthManager's blueprint now registers a global error handler for
AuthError and authenticates requests for all of its routes by default.
Authenticated users are made available as flask.g.requesting_user.
Only the login, OAuth, token refresh, registration and role listing
endpoints are exempt from this check. Additional routes can be marked as
public using the @auth.public_endpoint decorator or
auth.add_public_endpoint("auth.some_endpoint").
Configuration
Required Parameters
app: Flask application instancedb_dsn: PostgreSQL connection stringjwt_secret: Secret key for JWT signing
Optional Parameters
oauth_config: Dictionary of OAuth provider configurations (see below)token_expiry: JWT token expiry time in seconds (default: 3600)refresh_token_expiry: Refresh token expiry time in seconds (default: 2592000)environment_prefix: If set, loads all configuration from environment variables with this prefix (e.g.,AMPA_DATABASE_URL,AMPA_JWT_SECRET,AMPA_GOOGLE_CLIENT_ID,AMPA_GOOGLE_CLIENT_SECRET). Overrides other config if set.
Example oauth_config:
{
"google": {
"client_id": "...",
"client_secret": "..."
},
"github": {
"client_id": "...",
"client_secret": "..."
}
}
API Endpoints
Authentication
POST /api/v1/users/login- Login with username/password- Request:
{ "username": "string", "password": "string" } - Response:
{ "token": "jwt", "refresh_token": "jwt", "user": { ... } }
- Request:
POST /api/v1/users/login/oauth- Get OAuth redirect URL- Request:
{ "provider": "google|github|..." } - Response:
{ "redirect_url": "string" }
- Request:
GET /api/v1/users/login/oauth2callback- OAuth callback- Query Params:
code,state,provider - Response:
{ "token": "jwt", "refresh_token": "jwt", "user": { ... } }
- Query Params:
POST /api/v1/users/token-refresh- Refresh JWT token- Request:
{ "refresh_token": "jwt" } - Response:
{ "token": "jwt", "refresh_token": "jwt" }
- Request:
User Management
POST /api/v1/users/register- Register new user- Request:
{ "username": "string", "password": "string", "email": "string", ... } - Response:
{ "user": { ... }, "token": "jwt", "refresh_token": "jwt" }
- Request:
GET /api/v1/users/login/profile- Get user profile- Auth: Bearer JWT
- Response:
{ "user": { ... } }
GET /api/v1/users/roles- Get available roles- Response:
[ "admin", "user", ... ]
- Response:
API Tokens
POST /api/v1/users/{user}/api-tokens- Create API token- Request:
{ "name": "string", "scopes": [ ... ] } - Response:
{ "token": "string", "id": "uuid", ... }
- Request:
GET /api/v1/users/{user}/api-tokens- List API tokens- Response:
[ { "id": "uuid", "name": "string", ... } ]
- Response:
DELETE /api/v1/users/{user}/api-tokens/{token_id}- Delete API token- Response:
{ "success": true }
- Response:
Authentication Flow
- Login:
- User submits credentials to
/api/v1/users/login. - Receives JWT and refresh token.
- User submits credentials to
- Token Refresh:
- Use
/api/v1/users/token-refreshwith refresh token to get new JWT.
- Use
- OAuth:
- Get redirect URL from
/api/v1/users/login/oauth. - Complete OAuth flow via
/api/v1/users/login/oauth2callback.
- Get redirect URL from
- Protected Routes:
- All routes inside the provided blueprint are authenticated by default.
The authenticated user can be accessed via
g.requesting_user. Use@auth.require_auth()to protect custom routes in your application.
- All routes inside the provided blueprint are authenticated by default.
The authenticated user can be accessed via
User Object
The user object returned by the API typically includes:
{
"id": "uuid",
"username": "string",
"email": "string",
"roles": ["user", "admin"],
"created_at": "timestamp",
"last_login": "timestamp"
}
Token Management
- JWT: Used for authenticating API requests. Include in
Authorization: Bearer <token>header. - Refresh Token: Used to obtain new JWTs without re-authenticating.
- API Tokens: Long-lived tokens for programmatic access, managed per user.
Development
Setup
- Clone the repository
- Create virtual environment:
python -m venv venv
venv\Scripts\activate
- Install dependencies:
pip install -e ".[dev]"
Database Setup
createdb authlib
python -m authlib.cli db init
Running Tests
pytest
API Token Override for Testing
For testing purposes, you can bypass the database and provide a static mapping of API tokens to usernames using the api_tokens argument to AuthManager or the {PREFIX}API_TOKENS environment variable.
Usage
- Constructor argument:
AuthManager(api_tokens={"token1": "user1", "token2": "user2"})
- Environment variable:
Set
{PREFIX}API_TOKENSto a comma-separated list oftoken:usernamepairs, e.g.:
Replaceexport MYAPP_API_TOKENS="token1:user1,token2:user2"MYAPPwith your environment prefix.
Warning: This method is intended only for testing and development. Do not use this approach in production environments.
User Override for Testing
For testing purposes, you can force all authentication to return a specific user by setting the {PREFIX}USER_OVERRIDE environment variable:
export MYAPP_USER_OVERRIDE="testuser"
If set, all requests will be authenticated as the specified user, regardless of any tokens or credentials provided. This cannot be combined with api_tokens or db_dsn.
Warning: This method is intended only for testing and development. Do not use this approach in production environments.
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 the37lab_authlib-0.1.1758266861.tar.gz.
File metadata
- Download URL: the37lab_authlib-0.1.1758266861.tar.gz
- Upload date:
- Size: 18.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1ac4f1138230799d53dd6b13d496901515ac5c41cafcf9977c05c0518a22fbd
|
|
| MD5 |
71a6254a8515879272e0c380f39b7c52
|
|
| BLAKE2b-256 |
7236ae7d9c26098210cecca21843eeb23251cb070d30a3edb09cbb6af3ad6aaf
|
File details
Details for the file the37lab_authlib-0.1.1758266861-py3-none-any.whl.
File metadata
- Download URL: the37lab_authlib-0.1.1758266861-py3-none-any.whl
- Upload date:
- Size: 17.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64f92ad0161a62902ad47ac67d8245f86a7a304aa7500c4cc23d615c88fab65d
|
|
| MD5 |
7a645d0b2809d727d73482b766d7c2de
|
|
| BLAKE2b-256 |
8834d6ff2ae5605632e0a993f73f8f4bed5495737e032dbaccd0b1d03d38c689
|