Minimal JWT auth server for the pico ecosystem
Project description
Pico-Auth
Minimal JWT auth server for the Pico ecosystem.
Pico-Auth is a ready-to-run authentication server built on top of the pico-framework stack. It provides:
- RS256 JWT tokens with auto-generated RSA key pairs
- Refresh token rotation with SHA-256 hashed storage
- RBAC with four built-in roles:
superadmin,org_admin,operator,viewer - OIDC discovery endpoints (
.well-known/openid-configuration, JWKS) - Bcrypt password hashing (72-byte input limit enforced)
- Zero-config startup with auto-created admin user
Requires Python 3.11+
Architecture
Pico-Auth uses the full Pico stack with dependency injection:
| Layer | Component | Decorator |
|---|---|---|
| Config | AuthSettings |
@configured(prefix="auth") |
| Models | User, RefreshToken |
SQLAlchemy AppBase |
| Repository | UserRepository, RefreshTokenRepository |
@component |
| Service | AuthService |
@component |
| Security | JWTProvider, PasswordService, LocalJWKSProvider |
@component |
| Routes | AuthController, OIDCController |
@controller |
Installation
pip install -e ".[dev]"
Quick Start
1. Run the Server
python -m pico_auth.main
The server starts on http://localhost:8100 with:
- An auto-created admin user (
admin@pico.local/admin) - SQLite database at
auth.db - RSA keys at
~/.pico-auth/
2. Register a User
curl -X POST http://localhost:8100/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "alice@example.com", "password": "secret123", "display_name": "Alice"}'
3. Login
curl -X POST http://localhost:8100/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "alice@example.com", "password": "secret123"}'
Returns:
{
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "a1b2c3d4...",
"token_type": "Bearer",
"expires_in": 900
}
4. Access Protected Endpoint
curl http://localhost:8100/api/v1/auth/me \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIs..."
API Endpoints
| Method | Path | Auth | Description |
|---|---|---|---|
| POST | /api/v1/auth/register |
No | Register a new user |
| POST | /api/v1/auth/login |
No | Login and get tokens |
| POST | /api/v1/auth/refresh |
No | Refresh access token |
| GET | /api/v1/auth/me |
Bearer | Get current user profile |
| POST | /api/v1/auth/me/password |
Bearer | Change password |
| GET | /api/v1/auth/users |
Admin | List all users |
| PUT | /api/v1/auth/users/{id}/role |
Admin | Update user role |
| GET | /api/v1/auth/jwks |
No | JSON Web Key Set |
| GET | /.well-known/openid-configuration |
No | OIDC discovery |
Configuration
All settings are loaded from application.yaml and can be overridden with environment variables:
auth:
data_dir: "~/.pico-auth" # RSA key storage
access_token_expire_minutes: 15 # JWT lifetime
refresh_token_expire_days: 7 # Refresh token lifetime
issuer: "http://localhost:8100" # JWT issuer claim
audience: "pico-bot" # JWT audience claim
auto_create_admin: true # Create admin on startup
admin_email: "admin@pico.local" # Default admin email
admin_password: "admin" # Default admin password
database:
url: "sqlite+aiosqlite:///auth.db" # Database URL
echo: false # SQL logging
auth_client:
enabled: true # Enable auth middleware
issuer: "http://localhost:8100" # Must match auth.issuer
audience: "pico-bot" # Must match auth.audience
fastapi:
title: "Pico Auth API"
version: "0.1.0"
Environment variable override example:
AUTH_ISSUER=https://auth.myapp.com AUTH_ADMIN_PASSWORD=strong-password python -m pico_auth.main
JWT Token Claims
Access tokens include:
| Claim | Description |
|---|---|
sub |
User ID |
email |
User email |
role |
User role (superadmin, org_admin, operator, viewer) |
org_id |
Organization ID |
iss |
Issuer URL |
aud |
Audience |
iat |
Issued at (Unix timestamp) |
exp |
Expiration (Unix timestamp) |
jti |
Unique token ID |
Ecosystem
Pico-Auth is built on:
| Package | Role |
|---|---|
| pico-ioc | Dependency injection container |
| pico-boot | Bootstrap and plugin discovery |
| pico-fastapi | FastAPI integration with @controller |
| pico-sqlalchemy | Async SQLAlchemy with SessionManager |
| pico-client-auth | JWT auth middleware with SecurityContext |
Development
# Install in dev mode
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Run with coverage
pytest --cov=pico_auth --cov-report=term-missing tests/
# Full test matrix
tox
# Lint
ruff check pico_auth/ tests/
License
MIT - LICENSE
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
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 pico_auth-0.1.4.tar.gz.
File metadata
- Download URL: pico_auth-0.1.4.tar.gz
- Upload date:
- Size: 34.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4868b0b4e2a57968048546ae5427131d2750dc610d7b528ffcfada8e4ff81f94
|
|
| MD5 |
e4784c7ad256ed0cef3bd06248d9f969
|
|
| BLAKE2b-256 |
ce97a2081ee31a13fe3e6213e9dd12cbdcd3e98645d72bfcaf81f8b79ca7c293
|
Provenance
The following attestation bundles were made for pico_auth-0.1.4.tar.gz:
Publisher:
publish-to-pypi.yml on dperezcabrera/pico-auth
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pico_auth-0.1.4.tar.gz -
Subject digest:
4868b0b4e2a57968048546ae5427131d2750dc610d7b528ffcfada8e4ff81f94 - Sigstore transparency entry: 974950611
- Sigstore integration time:
-
Permalink:
dperezcabrera/pico-auth@961407bcd3f4e2c9aaa77d7bff26c6d75523f2bf -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/dperezcabrera
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@961407bcd3f4e2c9aaa77d7bff26c6d75523f2bf -
Trigger Event:
release
-
Statement type:
File details
Details for the file pico_auth-0.1.4-py3-none-any.whl.
File metadata
- Download URL: pico_auth-0.1.4-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f911f91db02517944b77e411f4ae79ccf49565a52045bb90a32cf3b9ea2ae88a
|
|
| MD5 |
657c33b42d589f49f432ae275455d3c8
|
|
| BLAKE2b-256 |
0000f2d07e0f8d1f3c9438c58d244ba0c2dd877a80de0f63c40630f809d3073e
|
Provenance
The following attestation bundles were made for pico_auth-0.1.4-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on dperezcabrera/pico-auth
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pico_auth-0.1.4-py3-none-any.whl -
Subject digest:
f911f91db02517944b77e411f4ae79ccf49565a52045bb90a32cf3b9ea2ae88a - Sigstore transparency entry: 974950644
- Sigstore integration time:
-
Permalink:
dperezcabrera/pico-auth@961407bcd3f4e2c9aaa77d7bff26c6d75523f2bf -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/dperezcabrera
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@961407bcd3f4e2c9aaa77d7bff26c6d75523f2bf -
Trigger Event:
release
-
Statement type: