weenspace-auth
WeenSpace Authentication.
What this package provides
- Django app extending the auth stack with UUID v4 identities.
- User, organization, and account models for multi-account and multi-organization structure.
- External identity bindings for Microsoft, Google, Apple, Zitadel, and custom OIDC-compatible providers.
- Bridge hooks to leverage logic from the existing
weenspace.authmodule when present. - Runtime mode selection for SP, IDP, or both.
Data model overview
- A user can belong to many organizations.
- A user can belong to many accounts.
- An organization can own many accounts.
- No tenant concepts are modeled in this package.
Requirements
- Python 3.14+
- Django 6.1+
Install
poetry add weenspace-auth
or from local workspace:
poetry -C src/backend/weenspace-auth install
Integrate with a Django project
- Add app to
INSTALLED_APPS:
INSTALLED_APPS = [
# ...
"weenspace.auth",
]
- Use UUID-based custom user model:
AUTH_USER_MODEL = "weenspace_auth.IdentityUser"
Note:
- Django requires
AUTH_USER_MODELto useapp_label.ModelName. - Keep the app label
weenspace_authinAUTH_USER_MODELfor compatibility. - Values like
weenspace.auth.IdentityUserare not valid in Django settings.
- Run migrations:
python manage.py migrate
- OIDC endpoints exposed by this package:
/auth/oidc/<provider>/login/
/auth/oidc/<provider>/callback/
/auth/oidc/logout/
/auth/oidc/<provider>/logout/
/auth/oidc/<provider>/revoke/
- Configure auth role mode (
sp,idp, orboth):
# Default is "both"
WEENSPACE_AUTH_MODE = "both"
# Optional explicit issuer for IDP discovery document.
WEENSPACE_AUTH_IDP_ISSUER = "https://auth.example.com/auth/oidc"
Mode behavior:
sp: exposes provider login/callback/logout/revoke endpoints.idp: exposes IDP endpoints only.both: exposes both SP and IDP endpoint sets.
IDP endpoints:
/auth/oidc/.well-known/openid-configuration
/auth/oidc/authorize/
/auth/oidc/token/
/auth/oidc/userinfo/
/auth/oidc/jwks/
IDP request handling is hook-driven through optional functions in weenspace.auth:
on_oidc_authorize_request(request)on_oidc_token_request(request)on_oidc_userinfo_request(request)on_oidc_jwks_request(request)
When hooks are not defined, IDP action endpoints return 501 Not Implemented.
- Optional claim mapping and default assignment:
WEENSPACE_AUTH_DEFAULT_ORGANIZATION_SLUG = "default-org"
WEENSPACE_AUTH_DEFAULT_ACCOUNT_SLUG = "default-account"
WEENSPACE_AUTH_PROVIDERS = {
"google": {
"client_id": "...",
"client_secret": "...",
"issuer": "https://accounts.google.com",
"organization_claim": "org_slug",
"account_claim": "account_slug",
"auto_create_org_account": True,
"end_session_endpoint": "",
"revocation_endpoint": "https://oauth2.googleapis.com/revoke",
"revocation_auth_method": "client_secret_post",
}
}
- Optional provider config:
WEENSPACE_AUTH_PROVIDERS = {
"microsoft": {
"client_id": "...",
"client_secret": "...",
"issuer": "https://login.microsoftonline.com/common/v2.0",
"scopes": ["openid", "email", "profile"],
"end_session_endpoint": "https://login.microsoftonline.com/common/oauth2/v2.0/logout",
},
"google": {
"client_id": "...",
"client_secret": "...",
"issuer": "https://accounts.google.com",
"revocation_endpoint": "https://oauth2.googleapis.com/revoke",
},
"apple": {
"client_id": "...",
"client_secret": "...",
"issuer": "https://appleid.apple.com",
"revocation_endpoint": "https://appleid.apple.com/auth/revoke",
},
"zitadel": {
"client_id": "...",
"client_secret": "...",
"issuer": "https://<your-zitadel-domain>",
"end_session_endpoint": "https://<your-zitadel-domain>/oidc/v1/end_session",
"revocation_endpoint": "https://<your-zitadel-domain>/oauth/v2/revoke",
},
}
- For production migration planning when switching the user model, follow:
docs/AUTH_USER_MODEL_MIGRATION_ROLLOUT.md
Publishing
This package is prepared for publishing to PyPI via Poetry:
poetry build
poetry publish
Local development with pyenv
pyenv install -s 3.14.0
pyenv local 3.14.0
python -m venv .venv
source .venv/bin/activate
pip install -U pip
pip install poetry
poetry install
poetry run pytest
Metadata
Release files for weenspace-auth 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| weenspace_auth-0.1.3.tar.gz | 13.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| weenspace_auth-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.2 kB
Release files / weenspace_auth-0.1.3.tar.gz
| Download URL | weenspace_auth-0.1.3.tar.gz |
|---|---|
| Size | 13.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
506d171be9cb4d76475c9db6e7b2d7e735df17c0af19be3dd8db5cebefcca084
|
|
BLAKE2b-256 checksum How to use checksums |
ead9a9d58c75d538b51c419199b10812964af3b479949d8cb9f721cb8955fa06
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.4.1 CPython/3.14.0 Darwin/25.6.0
|
Release files / weenspace_auth-0.1.3-py3-none-any.whl
| Download URL | weenspace_auth-0.1.3-py3-none-any.whl |
|---|---|
| Size | 17.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3a76fa069f8ca574cd51c9e44ee8bbb7fac32a2f31996aaaeaff42201abce6bc
|
|
BLAKE2b-256 checksum How to use checksums |
15d6e6cfa51fec96af9d637d2ed7196c4a0869479583b464efa7ab3dc8b8a4a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.4.1 CPython/3.14.0 Darwin/25.6.0
|