Authentification
Google OAuth et connexion par e-mail, plus la gestion des sessions.
routess prend en charge deux méthodes de connexion, Google OAuth (one-tap) et e-mail + mot de passe, qui aboutissent toutes les deux au même cookie de session JWT sur l'API.
Flux Google
- L'application web charge le SDK Google Identity Services et affiche le bouton de connexion.
- En cas de succès, Google renvoie un ID token au navigateur.
- Le web envoie l'ID token à
POST /api/v1/auth/google. - L'API vérifie la signature et l'audience du token contre le JWKS de Google.
- L'API crée ou met à jour l'utilisateur (par le
subGoogle), émet son propre JWT et le pose comme cookieHttpOnly,Secure,SameSite=Lax. - Les appels API suivants incluent le cookie automatiquement.
Flux e-mail
POST /api/v1/auth/signup-emailenregistre le compte (les mots de passe font au moins 12 caractères, hachés au repos) et envoie un lien de vérification valable 24 heures.POST /api/v1/auth/verify-emailconsomme le token du lien et connecte l'utilisateur.POST /api/v1/auth/login-emailconnecte lors des visites ultérieures et émet le même cookie de session que le flux Google.POST /api/v1/auth/request-password-resetenvoie par e-mail un lien de réinitialisation valable 30 minutes ;POST /api/v1/auth/reset-passwordle consomme.
L'envoi d'e-mails passe par Resend lorsque RESEND_API_KEY est défini ; sinon, les URL de vérification et de réinitialisation sont écrites sur stdout (le transport console dev/self-host).
Un compte créé via Google peut ajouter un mot de passe plus tard (POST /api/v1/users/me/password), pour que les deux méthodes fonctionnent pour le même utilisateur.
Pourquoi un JWT émis par le serveur ?
- Nous permet d'ajouter des claims spécifiques à l'application (rôle utilisateur, unité par défaut)
- Découple la durée de vie de la session du token de Google
- Nous évite d'appeler Google à chaque requête
Déconnexion
POST /api/v1/auth/logout efface le cookie. L'application web efface aussi l'état d'authentification Zustand.
Rafraîchissement de session
Les JWT ont une courte durée de vie (15 minutes). L'API les rafraîchit silencieusement à chaque requête authentifiée, en renvoyant un cookie frais. Si l'utilisateur s'absente trop longtemps, le cookie expire et il se reconnecte via la ré-authentification silencieuse de Google (sans interaction utilisateur dans la plupart des cas).