- Connexion Email/Password (route :
/api/auth/login) - Inscription (route :
/api/auth/register) - Connexion OAuth Google (route :
/api/auth/google) - Déconnexion (route :
/api/auth/logout) - Vérification email (route :
/api/auth/check-email) - Callback Google (route :
/api/auth/google/callback)
- Body :
{ email, password } - Vérification de l’email et du hash de mot de passe (bcrypt).
- Génération d’un JWT signé (
generateToken). - Renvoi du token en cookie HTTP-only (durée : 7j).
- Retourne aussi si l’utilisateur a déjà une organisation créée.
- En cas d’échec (email inconnu, mauvais mot de passe) : erreur 401.
- Extrait de réponse OK :
{
"message": "Connexion réussie",
"user": { "uid": "...", "email": "...", "firstname": "..." },
"hasOrganization": true
}- Body attendu :
email,firstname,lastname,passwordHash,inviteCode?
- Vérifie email non utilisé.
- Hash du mot de passe (bcryptjs, 10 rounds).
- Si
inviteCode: rattachement à une organisation (logique d’invitation spécifique). - Création du user et envoi d’un email de bienvenue (
WelcomeEmailService). - Statut de la réponse selon réussite ou doublon :
- Email déjà utilisé = 400 + message explicite
- Extrait de réponse OK :
{
"message": "Inscription réussie",
"user": { ...fields... }
}- Front : redirection vers consent Google → retour sur
/api/auth/google/callback - Callback (/callback) : renvoie le
coded’autorisation à/api/auth/google(POST). - Backend :
- Échange ce
codecontre un access_token Google. - Récupère l’info utilisateur.
- Cherche
user(par email/GoogleId) :- Maj du compte existant ou création rapide.
- Mot de passe généré pour les comptes Google-only.
- Génère un JWT, set cookie comme login classique, même logique hasOrganization.
- Échange ce
- Réponse typique :
{
"message": "Connexion Google réussie",
"user": { "uid": "...", "email": "...", "firstname": "..." },
"hasOrganization": true
}- Supprime le cookie
token(HTTP-only, scope/). - Purge aussi les cookies techniques résidentiels (
isLoggedIn,hasOrganization). - Réponse : 200 + message ou erreur (jamais critique).
- Utile lors de l’inscription (évite doublon, UX).
- Body :
{ email } - Retourne 404 si email inconnu.
- Sinon, les infos d’utilisateur minimal (pour pré-remplir ou diagnostic).
- JWT : généré côté serveur, signé, payload minimal (
userUid). Géré danssrc/lib/auth.ts. - Stockage : Cookie
token, HTTP-only (jamais accessible JS côté client), valable 7 jours. - Vérification : Sur chaque endpoint server-REST, la fonction utilitaire (
getCurrentUser) lit le cookie, vérifie le JWT, puis charge l’utilisateur courant.
- Actuellement :
- Email + mot de passe local
- Google OAuth (social)
- Pas de NextAuth ou d’abstraction tiers, toute la logique est customisée.
- Le support de MagicLink ou autres réseaux sociaux est possible à étendre via de nouvelles routes.
- Stockage des mots de passe : hash bcrypt fort.
- Cookies : sécurisés (HTTP-only, Secure en prod).
- JWT : secret configurable (
JWT_SECRET). - Anti-bruteforce : prévoir un WAF ou une limitation de requêtes côté provider/hébergement.
- Jamais de mot de passe transmis ou stocké en clair.
- Inscription classique
- Form sign-up → POST
/api/auth/register→ création bdd → JWT Set-Cookie → redirect onboarding
- Form sign-up → POST
- Connexion
- Form login → POST
/api/auth/login→ JWT Set-Cookie → redirect dashboard
- Form login → POST
- Connexion Google
- Click bouton Google → Redirection → Consent Google → Google callback → POST
/api/auth/google→ JWT/cookie → redirect
- Click bouton Google → Redirection → Consent Google → Google callback → POST
- Déconnexion
- POST
/api/auth/logout→ efface tous les cookies → redirect login
- POST
- Toute la logique centrale (création JWT, user context, accès) dans
src/lib/auth.ts. - Les routes API d’auth sont dans
src/app/api/auth/*. - Si ajout de provider, s’inspirer du pattern Google/route existant et bien isoler la logique OAuth/stockage.
Cette page doit servir de référence structurée au fonctionnement auth Teamify. Pour toute extension, suivre les standards sécurité Node/Next.