93 lines
4.1 KiB
Markdown
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.
|