Metadata-Version: 2.4
Name: pirates-auth
Version: 0.8.0
Summary: Passwordless SSO (OpenID Connect) authentication backend and abstract user, team and group models for Django. Used in the Czech Pirate Party.
License-Expression: MIT
License-File: LICENSE
Keywords: django,openid,sso
Author: Jan Bednařík
Author-email: jan.bednarik@gmail.com
Requires-Python: >=3.11
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Framework :: Django
Classifier: Framework :: Django :: 5.2
Classifier: Framework :: Django :: 6.0
Classifier: Topic :: Utilities
Requires-Dist: Django (>=5.2,<7.0)
Requires-Dist: mozilla-django-oidc (>=3.0,<5.0)
Project-URL: Homepage, https://gitlab.pirati.cz/to/pirates
Project-URL: Repository, https://gitlab.pirati.cz/to/pirates
Description-Content-Type: text/markdown

# Pirates

Django app na uživatele, týmy a skupiny, s napojením na SSO.

[![code style: Black](https://img.shields.io/badge/code%20style-Black-000000)](https://github.com/psf/black)
[![license MIT](https://img.shields.io/badge/license-MIT-brightgreen)](LICENSE)
![Python Version](https://img.shields.io/pypi/pyversions/pirates-auth)
![Django Version](https://img.shields.io/pypi/djversions/pirates-auth?color=0C4B33)

Bezheslová SSO autentizace (OpenID Connect) a abstraktní modely uživatele, týmu
a skupiny pro Django.

## Požadavky

* Python 3.11+
* Django 5.2–6.x

## Instalace

```
pip install pirates-auth
```

Na PyPI se balíček jmenuje **`pirates-auth`**, ale importuje se jako `pirates` –
pod tímto názvem se také přidává do `INSTALLED_APPS`.

## Použití

### Settings

Přidat `pirates` do `INSTALLED_APPS`.

### Modely

Jsou k dipozici abstraktní modely pro uživatele, tým a organizační skupinu. Ty
lze doplnit o další fieldy specifické pro aplikaci. Příklad:

```python
from django.db import models
from pirates.models import AbstractUser

class CustomUser(AbstractUser):
    is_friendly = models.BooleanField(default=True)
```

A nezapomenout model pro uživatele nastavit v settings:

```python
AUTH_USER_MODEL = "myapp.CustomUser"
```

Uživatel je bezheslový – autentizuje se přes SSO (OpenID Connect), takže
`AbstractUser` nedědí z `AbstractBaseUser` a nemá pole `password` ani
`last_login`. `get_session_auth_hash()` je proto odvozen z `sso_id`, aby
`django.contrib.auth.login()` fungoval i na Djangu 6+.

### URLs

URL patterns (v současné době pouze pro OpenID Connect) jsou definovány v
`pirates.urls`. Stačí je připojit k URL patterns projektu:

```python
from pirates.urls import urlpatterns as pirates_urlpatterns 

urlpatterns = [
    # URL patterns projektu
    # ...
] + pirates_urlpatterns

```

### SSO přes OpenID Connect

Implementaci OpenID zajišťuje knihovna
[mozilla-django-oidc](https://github.com/mozilla/mozilla-django-oidc).

V settings projektu je třeba nastavit několik konfiguračních konstant a
autentifikační backend. Příklad settings (s využitím
[django-environ](https://github.com/joke2k/django-environ)):

```python
from os.path import join
import environ

env = environ.Env()

AUTHENTICATION_BACKENDS = ["pirates.auth.PiratesOIDCAuthenticationBackend"]

OIDC_RP_CLIENT_ID = env.str("OIDC_RP_CLIENT_ID")
OIDC_RP_CLIENT_SECRET = env.str("OIDC_RP_CLIENT_SECRET")
OIDC_RP_REALM_URL = env.str("OIDC_RP_REALM_URL")
OIDC_RP_SIGN_ALGO = "RS256"
OIDC_OP_JWKS_ENDPOINT = join(OIDC_RP_REALM_URL, "protocol/openid-connect/certs")
OIDC_OP_AUTHORIZATION_ENDPOINT = join(OIDC_RP_REALM_URL, "protocol/openid-connect/auth")
OIDC_OP_TOKEN_ENDPOINT = join(OIDC_RP_REALM_URL, "protocol/openid-connect/token")
OIDC_OP_USER_ENDPOINT = join(OIDC_RP_REALM_URL, "protocol/openid-connect/userinfo")
```

URL patterns pro OpenID Connect už jsou součástí `pirates.urls` (viz výše).

#### Signál po přihlášení

Po přihlášení uživatele je poslán signál `pirates.signals.post_login` s
parametry:

* `sender` - `PiratesOIDCAuthenticationBackend`
* `user` - přihlášený uživatel (instance `AUTH_USER_MODEL`)
* `created` - `True`/`False` zda-li byl vytvořen nový uživatel
* `request` - instance `HttpRequest`

