Procédure de câblage — @kanmaber/auth-backend et auth-frontend dans jobPipeline¶
Contexte¶
jobPipeline installe les packages partagés @kanmaber/auth-backend et
@kanmaber/auth-frontend (via tarball local, versions figées) et le
schéma Prisma fusionné existe déjà en base. Mais AuthModule n'était
appelé nulle part dans le code applicatif — seul un script de smoke test
l'instanciait isolément. Cette note documente la procédure de câblage
réel (routes HTTP fonctionnelles, pas juste un assemblage DI) suivie et
validée le 2026-07-03.
Contenu¶
Incompatibilité architecturale de départ¶
jobPipeline a sa propre architecture DI/HTTP, incompatible telle quelle avec ce qu'attend le package :
- Deux
DIContainerdifférents du même nom — celui de jobPipeline (container.set/get,registerModule(name, module)) n'est pas celui attendu parAuthModule(DIContainer.getInstance(config), registre de modules à priorités,obtenirPrismaClient()). GestionnaireModulairede jobPipeline construit sonIHttpContexten castant directementreq/resExpress, sans les méthodes de confort de l'interface — la quasi-totalité des handlers du package n'en ont pas besoin, saufRevoquerTousTokensHandler(context.request.getHeader('Authorization'), absente sur unRequestExpress brut).- Format de JWT différent —
authMiddleware.tsde jobPipeline litpayload.sub/payload.idet traiterolecomme une chaîne ; le package émetpayload.idUtilisateuretrolecomme un objet{ idRole, nom, permissions[] }. Un token du package n'est pas interprété correctement par le middleware existant tel quel.
Décision (Option A retenue) : plutôt que corriger le bridge
IHttpContext et le format de token du système existant, utiliser le
propre bridge du package (AuthModuleController, déjà complet) avec un
routeur Express dédié et un container DI dédié, en parallèle du
système de jobPipeline, sans le modifier. Suit le pattern documenté dans
shared/architecture/guide-architecture-ddd.
Étapes de câblage¶
-
Variables d'environnement dans
BackEnd/.env:JWT_ACCESS_SECRET,JWT_REFRESH_SECRET,JWT_ACCESS_EXPIRES,JWT_REFRESH_EXPIRES,TOTP_ENCRYPTION_KEY(32 bytes hex),BCRYPT_ROUNDS,SMTP_*,EMAIL_FROM(_NAME),APP_NAME,APP_URL.JWT_SECRET(utilisé par l'authMiddlewareexistant) reste séparé — deux systèmes de tokens coexistent. Redis optionnel (fallback mémoire automatique). -
Container DI dédié + montage des routes — nouveau fichier
BackEnd/src/shared/infrastructure/config/AuthPackageConfiguration.ts: instancieAuthDIContainer.getInstance({ enableLogging: true }), créeAuthModule, l'initialise, puis construitAuthModuleControlleravec le mapping complet des ~36 controllers (auth, twoFactor, password, sessions, tokens, profile, security). Dansapp.ts, unRouterExpress dédié itère surauthModuleRoutes.routeset monte chaque route surauthModuleRoutes.prefix(/api/auth) — en parallèle duGestionnaireModulaireexistant, sans le modifier.
Point d'attention : authModuleRoutes marque certaines routes
isPublic, mais AuthModuleController ne vérifie pas ce flag
lui-même (chaque handler vérifie l'auth via context.getUserId(),
qui lève une erreur si non authentifié) — fonctionnellement correct
mais moins strict qu'un vrai middleware amont ; à durcir plus tard si
besoin.
-
Middleware d'authentification — décision encore ouverte : dupliquer
authMiddleware.tsenauthPackageMiddleware.ts(lisantpayload.idUtilisateuretrolecomme objet) seulement si les routes métier de jobPipeline (candidatures, CV...) doivent un jour vérifier un utilisateur connecté via les tokens de ce package. Ne pas l'appliquer sur/api/auth/*(le package gère sa propre validation). -
Seed d'un
ProfilUtilisateur—Utilisateur.profilIdest obligatoire. Un scriptprisma/seeds/seed.ts(référencé pardb:seedmais absent) upserte un profil par défaut. Version finale simplifiée : upsert simple parcode: 'UTILISATEUR'(id auto-généré) — voir jobPipeline/debug/lecons-cablage-auth-package pour l'historique complet du bug de résolution du profil par défaut (idRolehardcodé côté package, corrigé depuis par un lookup dynamique parcode). -
Test end-to-end réel — seule preuve valable que le câblage fonctionne :
curlsur/api/auth/registerpuis/api/auth/connexion, pas seulement le typecheck ou le smoke test d'assemblage DI. Réalisé avec succès le 2026-07-03 : inscription, connexion, JWT émis avec le format attendu (idUtilisateur+role: {idRole, nom, permissions[]}). Écarts non documentés à l'origine découverts à cette occasion : Zod exige aussiconfirmationMotDePasseetaccepteCGU: true; mot de passe min. 12 caractères avec maj/min/chiffre/spécial ; connexion bloquée tant queemailVerifien'est pastrueen base. -
Frontend (non fait) —
FrontEnd/src/main.tsxn'existe pas encore (point d'entrée React<BrowserRouter>à créer). Écarts de peer dependencies à résoudre avant install propre :@hookform/resolvers(jobPipeline^5.0.1vs package^3.3.0) etlucide-react(jobPipeline0.488.0vs package^1.7.0, API différente). EnsuiteconfigureAuthModule({ apiBaseUrl, security: { loginUrl, defaultRedirectAfterLogin } })et montage des pages exportées (LoginPage,RegisterPage...).
Décision / Conclusion¶
- Option A confirmée et implémentée : DI + routeur Express dédiés, système existant de jobPipeline non modifié.
- Câblage backend fonctionnel de bout en bout (inscription + connexion réelles testées), après correction du bug de profil par défaut côté package (voir jobPipeline/debug/lecons-cablage-auth-package).
- Restent ouverts : décision middleware dupliqué, alignement peer deps
frontend, scaffolding
main.tsx, test navigateur réel, résolution SMTP (rejet550 SPAMconstaté lors du test — cf. veille-financement/configuration-email-deliverabilite pour un cas similaire déjà traité).
À faire¶
- Trancher le middleware d'auth dupliqué (étape 3) selon les besoins des futures routes métier.
- Aligner
@hookform/resolvers/lucide-react, créermain.tsx, appelerconfigureAuthModule(), tester la connexion réelle dans le navigateur. - Résoudre le problème de délivrabilité SMTP (rejet 550).
Liens connexes¶
- jobPipeline/debug/lecons-cablage-auth-package — leçons détaillées : bug FK hardcodée résolu côté package, piège cache npm
file:...tgzrésolu par bump de version - shared/architecture/guide-architecture-ddd — référence DDD suivie par le package (use case 5 étapes, repository par agrégat)
- shared/flow-connexion-auth — flow auth transversal (login, 2FA, refresh JWT) correspondant à ce package
- veille-financement/configuration-email-deliverabilite — cas similaire de rejet SMTP 550, pertinent pour le problème SMTP encore ouvert
- jobPipeline/index — index du projet parent (à créer)