Files
limier/docs/03-authentik.md
hcornet 78fb13b0e5
CI / Backend — lint, types, tests (push) Failing after 4m44s
CI / Interface — types et compilation (push) Successful in 10m23s
CI / Construction des images (sans publication) (push) Skipped
first sync
2026-09-12 13:10:16 +02:00

93 lines
4.1 KiB
Markdown

# Configuration Authentik
Procédure pour l'instance `authentik.tips-of-mine.com`, en suivant les
conventions déjà en place sur tes autres applications.
## 1. Groupes
Répertoire → Groupes. Créer, selon la convention `GL-<app>` / `GL-<app>-Admin` :
| Groupe | Effet dans Limier |
| ------------------ | -------------------------------------------------- |
| `GL-Limier` | plan `interne` — aucun quota mensuel |
| `GL-Limier-Admin` | plan `interne` + accès à l'espace d'administration |
Les visiteurs qui s'inscrivent sans appartenir à ces groupes reçoivent le plan
`gratuit` et son quota. L'appartenance est **relue à chaque connexion** : retirer
quelqu'un d'un groupe lui retire ses droits à sa prochaine ouverture de session,
sans intervention en base.
## 2. Fournisseur OAuth2
Applications → Fournisseurs → Créer → OAuth2/OpenID.
| Champ | Valeur |
| ------------------------ | ----------------------------------------------------------- |
| Nom | `Tips-Of-Mine-Limier` |
| Type de client | **Confidentiel** |
| Flux d'autorisation | `default-provider-authorization-implicit-consent` |
| **URIs de redirection** | `https://limier.tips-of-mine.com/api/auth/retour` |
| Clé de signature | `authentik Token Signing` |
> **Le piège rencontré sur Enclume.** L'URI va dans « **URIs de redirection** »,
> pas dans « URI de déconnexion ». Saisie au mauvais endroit, la première
> connexion échoue sur `Redirect URI Error` et le champ correct reste vide.
Relever l'identifiant et le secret du client pour le `.env`.
## 3. Application
Applications → Applications → Créer.
| Champ | Valeur |
| ------------- | ------------------------------- |
| Nom | `Limier` |
| **Slug** | `limier` |
| Fournisseur | `Tips-Of-Mine-Limier` |
Le slug détermine l'émetteur :
`https://authentik.tips-of-mine.com/application/o/limier/`. Il doit
correspondre **exactement** à `LIMIER_OIDC_ISSUER`.
> Sur l'intégration Cloudflare Access, un slug erroné avait produit un 404 sur
> `/jwks/` — l'intégration n'avait jamais abouti sans que rien ne le signale.
> Vérifier : `curl -s https://authentik.tips-of-mine.com/application/o/limier/.well-known/openid-configuration | jq .issuer`
Lier ensuite les deux groupes à l'application (onglet Liaisons), pour que
l'application reste cloisonnée comme les sept autres.
## 4. La revendication `groups`
Depuis la 2026.8, les correspondances par défaut exposent bien les groupes — le
test de Cloudflare Access l'a confirmé, la revendication arrivait au niveau
racine sans correspondance personnalisée.
Si l'instance est plus ancienne, rattacher la correspondance de portée
« OAuth Mapping: OpenID groups » déjà créée pour Grafana, Gitea et Harbor.
Rappel : elle doit utiliser `request.user.groups` et non `request.user.ak_groups`,
relation dépréciée depuis la 2026.8.
Limier prévoit les deux cas : si la revendication est absente du jeton
d'identité, il interroge `userinfo`.
## 5. Vérification
Après `docker compose up -d` :
1. Ouvrir `https://limier.tips-of-mine.com` → « Se connecter ».
2. Redirection vers Authentik, authentification, retour sur l'interface.
3. Le nom et le quota apparaissent en haut à droite.
4. Membre de `GL-Limier-Admin` : `curl` sur `/api/admin/tableau-de-bord`
renvoie 200 ; sinon, 403.
En cas d'échec : `docker compose logs limier-api | grep -i auth`. Les messages
sont explicites (`decouverte_oidc_impossible`, `etat_oidc_incoherent`,
`echec_validation_identite`) et ne contiennent jamais de jeton.
## Ce que Limier ne fait pas
Aucune gestion de mot de passe, aucun compte local, aucune réinitialisation.
Authentik est la seule source d'identité. Le cookie de session ne porte que
l'identifiant interne de l'utilisateur : plan et droits sont relus en base à
chaque requête.