Connexion et comptes - Volfieldd/deux-regards GitHub Wiki
L'administration est réservée aux comptes qui ont un rôle (Administrateur, Photographe, Modérateur, Relecteur). L'application ne stocke et ne gère aucun mot de passe : la connexion passe par OpenID Connect, avec Zitadel Cloud comme fournisseur. Google peut y être branché comme fournisseur externe.
- On ouvre
/admin. Sans session, le site redirige vers/auth/login, puis vers Zitadel. - On se connecte sur Zitadel (compte local ou « Continuer avec Google »). La double authentification se règle dans Zitadel.
- Zitadel renvoie vers
/auth/callback. Le site vérifie la réponse (state,nonce, PKCE, signature, émetteur, audience), puis lit les rôles. - Le site cherche le compte de cette identité (
sub) dans sa base, ou le crée à la première connexion. Les rôles vivent dans la base du site : Zitadel ne fait que transporter l'identité.-
Première connexion avec le rôle
admindans Zitadel (clé réglable parOIDC_ADMIN_ROLE, donné dans l'organisationOIDC_ORG_ID) : le compte est créé administrateur. Ce rôle Zitadel ne sert qu'à cette amorce. - Sinon : le compte est créé en attente, et la page « Compte en attente » s'affiche ; aucune session n'est ouverte. Un administrateur lui donne un rôle dans Comptes et rôles ; la connexion suivante passe.
- Compte désactivé : « Accès refusé ».
-
Première connexion avec le rôle
- Avec un rôle, une session est ouverte et l'on arrive sur la page demandée. Les rôles sont relus à chaque requête : un rôle retiré, un compte désactivé ou supprimé perd l'accès tout de suite.
Déconnexion : bouton « Se déconnecter » de l'admin. La session est supprimée sur le site et chez Zitadel.
Pas à pas détaillé, avec les écrans de la console : deploy/unraid/README.md, section Zitadel. Résumé :
- Créer une organisation, puis un projet (par exemple « site photo »). Dans le projet, créer le rôle
admin. - Dans le projet, créer une application Web :
- méthode d'authentification Code ;
- URL de redirection
https://<domaine>/auth/callback(ethttp://localhost:3000/auth/callbackpour le développement) ; - URL après déconnexion
https://<domaine>/.
- Optionnel : ajouter Google comme fournisseur externe (client OAuth à créer dans Google Cloud).
- Donner le rôle
adminà Sébastien et Julien, puis désactiver l'inscription libre. - Reporter dans
.env:OIDC_ISSUER,OIDC_CLIENT_ID,OIDC_CLIENT_SECRET,OIDC_PROJECT_ID(identifiant du projet) etOIDC_ORG_ID(identifiant de l'organisation).
Retirer l'accès à quelqu'un : dans l'admin, Comptes et rôles, retirer ses rôles, le désactiver ou supprimer son compte. L'effet est immédiat. Retirer son rôle dans Zitadel ne suffit plus (le rôle Zitadel ne sert qu'à la première connexion) ; le bloquer dans Zitadel l'empêche en revanche de se connecter.
Garde-fou : les identités listées dans ADMIN_SUBS (variable d'environnement, sub séparés par des virgules) sont toujours administratrices, même si leur compte a été modifié dans l'admin. Il reste aussi toujours au moins un administrateur actif.
Dans Comptes et rôles, choisir le photographe dans « Photographe lié » (un photographe par compte). Une fois lié, il est proposé par défaut à l'import et dans l'app Terrain. Les anciens liens (champ « Compte de connexion » des fiches Photographes) sont devenus des comptes administrateurs lors de la mise à jour.
Toutes les connexions et les actions de l'admin sont notées dans le Journal (gardé 13 mois).
| Durée | 8 h sans activité, et 24 h au plus même en activité |
| Cookie |
__Host-session en HTTPS (session en HTTP local) : httpOnly, SameSite=Lax, et Secure en HTTPS |
| Stockage | côté serveur ; la base ne garde que l'empreinte SHA-256 du jeton |
| Nouvelle connexion | nouvelle session à chaque fois, l'ancienne est détruite |
| Formulaires | jeton anti-falsification (CSRF) sur toute écriture, déconnexion comprise |
| Retour de Zitadel | 10 minutes au plus après le départ (cookie de transaction signé, un par onglet) ; sinon « Connexion expirée » |
On peut brancher Google (ou un autre fournisseur OIDC) directement, sans Zitadel. Il faut alors renseigner OIDC_ALLOWED_SUBS avec les sub autorisés. Un compte n'entre que s'il est dans cette liste et que son e-mail est vérifié par le fournisseur.
Elle sert à essayer l'admin sans Zitadel, sur un poste de développement ou un serveur de test :
- Mettez
LOCAL_AUTH_TOKEN=<au moins 16 caractères aléatoires>dans.env, puis redémarrez. - Ouvrez
/admin. Le formulaire « Connexion de test » demande l'auteur à incarner et le jeton. - Un bandeau rouge « Connexion locale de test » reste affiché dans l'admin.
Garde-fous :
- le serveur refuse de démarrer avec cette variable si
PUBLIC_URLest en HTTPS ou siNODE_ENV=production; - le jeton est exigé : un serveur de test exposé sur le réseau local n'est pas ouvert à tous ;
- les tentatives de connexion sont limitées (
AUTH_RATE_LIMIT).
Si le photographe choisi est lié à un compte, la session reprend ce compte ; sinon elle utilise un compte local:<slug>, administrateur à sa création.
Générer un jeton : node -e "console.log(require('crypto').randomBytes(24).toString('base64url'))".