Ajoute l'authentification Google en complément de la connexion par mot de passe. Le callback OAuth émet le même JWT que la connexion classique, donc le middleware d'authentification et ProtectedRoute restent inchangés. Backend - stratégie passport-google-oauth20 dans src/config/passport.js - routes GET /api/auth/google et /google/callback, documentées dans Swagger - un compte existant avec le même email est rattaché automatiquement au compte Google, et son email passe vérifié - les routes répondent 503 si les identifiants ne sont pas configurés, plutôt que de faire échouer le démarrage du serveur - login et changePassword ne comparent plus un hash inexistant sur les comptes sans mot de passe Base de données - password devient nullable - colonnes provider, providerId et avatarUrl, index unique sur le couple provider/providerId Frontend - page /auth/callback qui récupère le token et redirige selon le rôle - boutons Google de Connexion et Inscription branchés - boutons Facebook désactivés en attendant les identifiants Meta Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
216 lines
5.6 KiB
JavaScript
216 lines
5.6 KiB
JavaScript
const express = require("express");
|
|
const { register, login, verifyEmail, verifyCode, forgotPassword, resetPassword, me, changePassword, deleteAccount, oauthCallback } = require("../controllers/auth.controller");
|
|
const authMiddleware = require("../middlewares/auth.middleware");
|
|
const validate = require("../middlewares/validate.middleware");
|
|
const { registerSchema, loginSchema } = require("../validations/auth.validation");
|
|
const { passport, googleEnabled } = require("../config/passport");
|
|
|
|
const router = express.Router();
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/auth/register:
|
|
* post:
|
|
* summary: Inscription d'un utilisateur
|
|
* tags:
|
|
* - Auth
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* properties:
|
|
* firstname:
|
|
* type: string
|
|
* lastname:
|
|
* type: string
|
|
* email:
|
|
* type: string
|
|
* password:
|
|
* type: string
|
|
* responses:
|
|
* 201:
|
|
* description: Utilisateur créé
|
|
*/
|
|
router.post("/register", validate(registerSchema), register);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/auth/login:
|
|
* post:
|
|
* summary: Connexion utilisateur
|
|
* tags:
|
|
* - Auth
|
|
* requestBody:
|
|
* required: true
|
|
* responses:
|
|
* 200:
|
|
* description: Connexion réussie
|
|
*/
|
|
|
|
router.post("/login", validate(loginSchema), login);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/auth/me:
|
|
* get:
|
|
* summary: Informations de l'utilisateur connecté
|
|
* tags:
|
|
* - Auth
|
|
* security:
|
|
* - bearerAuth: []
|
|
* responses:
|
|
* 200:
|
|
* description: Profil utilisateur
|
|
*/
|
|
|
|
router.get("/me", authMiddleware, me);
|
|
/**
|
|
* @swagger
|
|
* /api/auth/verify-email/{token}:
|
|
* get:
|
|
* summary: Vérification de l'adresse email
|
|
* tags:
|
|
* - Auth
|
|
* parameters:
|
|
* - in: path
|
|
* name: token
|
|
* required: true
|
|
* schema:
|
|
* type: string
|
|
* description: Token de validation envoyé par email
|
|
* responses:
|
|
* 200:
|
|
* description: Email vérifié avec succès.
|
|
* 400:
|
|
* description: Lien de validation invalide ou expiré.
|
|
* 500:
|
|
* description: Erreur serveur.
|
|
*/
|
|
|
|
router.get("/verify-email/:token",verifyEmail);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/auth/forgot-password:
|
|
* post:
|
|
* summary: Demande de réinitialisation du mot de passe
|
|
* tags:
|
|
* - Auth
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* required:
|
|
* - email
|
|
* properties:
|
|
* email:
|
|
* type: string
|
|
* format: email
|
|
* example: jean.dupont@gmail.com
|
|
* responses:
|
|
* 200:
|
|
* description: Si un compte existe avec cet email, un lien de réinitialisation a été envoyé.
|
|
* 400:
|
|
* description: Email requis.
|
|
* 500:
|
|
* description: Erreur serveur.
|
|
*/
|
|
|
|
router.post("/forgot-password", forgotPassword);
|
|
/**
|
|
* @swagger
|
|
* /api/auth/reset-password/{token}:
|
|
* post:
|
|
* summary: Réinitialisation du mot de passe
|
|
* tags:
|
|
* - Auth
|
|
* parameters:
|
|
* - in: path
|
|
* name: token
|
|
* required: true
|
|
* schema:
|
|
* type: string
|
|
* description: Token de réinitialisation reçu par email
|
|
* requestBody:
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* required:
|
|
* - password
|
|
* properties:
|
|
* password:
|
|
* type: string
|
|
* format: password
|
|
* example: NouveauPassword123
|
|
* responses:
|
|
* 200:
|
|
* description: Mot de passe réinitialisé avec succès.
|
|
* 400:
|
|
* description: Lien invalide, expiré ou mot de passe invalide.
|
|
* 500:
|
|
* description: Erreur serveur.
|
|
*/
|
|
router.post("/reset-password/:token", resetPassword);
|
|
|
|
router.post("/verify-code", verifyCode);
|
|
router.patch("/change-password", authMiddleware, changePassword);
|
|
router.delete("/account", authMiddleware, deleteAccount);
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/auth/google:
|
|
* get:
|
|
* summary: Démarre la connexion via Google (redirection OAuth 2.0)
|
|
* tags:
|
|
* - Auth
|
|
* responses:
|
|
* 302:
|
|
* description: Redirection vers l'écran de consentement Google.
|
|
* 503:
|
|
* description: Connexion Google non configurée sur ce serveur.
|
|
*/
|
|
|
|
/**
|
|
* @swagger
|
|
* /api/auth/google/callback:
|
|
* get:
|
|
* summary: Retour de Google, émet le JWT et redirige vers le front
|
|
* tags:
|
|
* - Auth
|
|
* responses:
|
|
* 302:
|
|
* description: Redirection vers FRONTEND_URL/auth/callback avec le token.
|
|
*/
|
|
if (googleEnabled) {
|
|
router.get(
|
|
"/google",
|
|
passport.authenticate("google", { scope: ["profile", "email"], session: false })
|
|
);
|
|
|
|
router.get(
|
|
"/google/callback",
|
|
passport.authenticate("google", {
|
|
session: false,
|
|
failureRedirect: `${process.env.FRONTEND_URL || "http://localhost:5173"}/auth/callback?error=${encodeURIComponent(
|
|
"Connexion Google refusée."
|
|
)}`,
|
|
}),
|
|
oauthCallback
|
|
);
|
|
} else {
|
|
// Sans identifiants configurés, on répond explicitement plutôt que de
|
|
// laisser passport planter au démarrage.
|
|
const notConfigured = (req, res) =>
|
|
res.status(503).json({ message: "La connexion Google n'est pas configurée sur ce serveur." });
|
|
|
|
router.get("/google", notConfigured);
|
|
router.get("/google/callback", notConfigured);
|
|
}
|
|
|
|
module.exports = router; |