Aller au contenu

Identité, sessions et autorisations

Google prouve l'identité. Yisin API décide ce que cette identité peut faire. Les interfaces ne deviennent jamais l'autorité des droits.

Parcours retenu

Navigateur
   │  Authorization Code + state + PKCE
   ▼
Google OIDC
   │  ID token signé
   ▼
yisin-web ou yisin-admin
   │  session chiffrée HttpOnly, 50 minutes
   │  BFF /api/yisin/* ajoute Authorization: Bearer
   ▼
yisin-api
   │  signature + issuer + audience + dates + statut + rôles
   ▼
PostgreSQL

Le callback ne place ni le secret Google ni l'ID token dans le JavaScript du navigateur. Auth.js conserve les données techniques dans un cookie de session chiffré, HttpOnly et SameSite=Lax. Le BFF déchiffre la session côté serveur, rejette les jetons proches de l'expiration et ne transmet que quelques en-têtes explicitement autorisés.

Dans yisin-admin, les mutations BFF exigent en plus une origine identique et un jeton CSRF à double soumission obtenu sur une route authentifiée.

Deux clients, une autorité

yisin-web et yisin-admin ont chacun leur propre Client ID Google et leur URL de callback. yisin-api accepte uniquement ces deux audiences. Au premier appel /me, le couple stable (issuer, sub) crée un compte local, un workspace personnel et le rôle owner de ce workspace.

L'adresse électronique ne sert jamais d'identifiant primaire et ne confère aucun rôle. Un rôle de plateforme est attribué explicitement à l'account_id. L'interface Admin refuse toute session dont platform_roles est vide ; l'API répète toujours l'autorisation sur chaque contrat sensible.

Limite MFA assumée

Le jeton d'identité Google standard prouve l'authentification, mais ne fournit pas de façon fiable une preuve amr ou acr indiquant un second facteur. Yisin ne transforme donc pas une connexion Google ordinaire en « MFA vérifié ».

Conséquence : la console peut authentifier et reconnaître un opérateur, mais les mutations qui utilisent la politique RequireAdminPermission restent refusées. Leur activation nécessite un fournisseur capable d'attester le MFA, ou un mécanisme de step-up Yisin conçu et audité.

Secrets et environnements

En local, les interfaces peuvent lire les documents JSON Google ignorés par Git et un fichier .auth-secret généré séparément. En préproduction et en production, les valeurs sont injectées depuis le gestionnaire de secrets ; les fichiers téléchargés depuis Google ne sont pas intégrés aux images Docker.

Les URLs AUTH_URL et de callback doivent correspondre exactement aux valeurs déclarées dans Google Cloud. En production, tous les échanges passent par TLS et les cookies prennent le préfixe __Secure-.

État de recette

Contrôle État
Validation Google JWT/JWKS et deux audiences testé côté API
Rattachement idempotent (issuer, sub) testé côté API
Session et BFF Web/Admin code et dépendances livrés
CSRF des mutations Admin code livré, recette navigateur à exécuter
Refus Admin sans rôle code livré, recette navigateur à exécuter
Attribution explicite du premier rôle commande livrée
MFA administratif attesté non satisfait
TLS, reverse proxy et rotation des secrets recette production à faire