Type something to search...
Devlog #1 – Roadmap & authentification sĂ©curisĂ©e

Devlog #1 – Roadmap & authentification sĂ©curisĂ©e

🚀 Focus fonctionnel : Les premiùres briques

Voici les premiĂšres briques / milestones du projet :

img.png

1. Clean Init

Reprise de zĂ©ro : recrĂ©ation d’un monorepo sain avec une structure claire (apps/api, apps/web, packages/
), et mise en place des bases pour la qualitĂ© :

  • Frameworks Ă  jour
  • Des tests unitaires avec des examples
  • Une suite de test e2e avec Playwrigt
  • Une base solide de documentation
  • Une authentication propre et sĂ©curisĂ©e en place (plus sur ce sujet dans le focus technique du jour !)

2. Profil

Chaque JetPeople aura un espace personnel, oĂč il pourra bientĂŽt consulter son level, ses compĂ©tences, ses objectifs, son historique
 C’est la base de tout l’accompagnement personnalisĂ© Ă  venir.

3. Journal de bord

C’est le module qui regroupera tous les entretiens rĂ©alisĂ©s : annuels, professionnels, sexennaux et suivis de mission. Un espace clair, centralisĂ©, accessible Ă  tout moment.

Avec cette premiĂšre “vraie” feature, je compte dĂ©jĂ  mettre le suivi de chacun au centre du projet et permettre Ă  tout le monde de se familiariser avec la plateforme.

4. Trajectoires de carriĂšre

CƓur du projet : la mise en place des Jobs et de leurs spĂ©cialitĂ©s sous forme de Job Ladder.

Exemples :

  • Software Engineer → Frontend, Backend, Fullstack, Mobile
  • QA Engineer → Manual, Automation
  • Design → UI, UX, Research

Chaque niveau est découpé avec des objectifs clairs et actionnables, permettant de comprendre comment progresser et se situer à tout moment.

5. Galaxie des compétences

Un outil interactif pour cartographier son parcours au sein de la galaxie des compĂ©tences, le but est de pouvoir explorer/dĂ©couvrir des nouveaux sujets Ă  apprendre, pouvoir visualiser oĂč l’on en est, mais aussi d’avoir une cartographie complĂšte pour Jetdev. Je pense vraiment que cet outil va nous aider Ă  voir plus clair sur comment et vers quoi progresser et crĂ©er beaucoup d’échange du fait que nous allons complĂ©ter cette galaxie ensemble.

đŸ€“ Pour les geeks qui me lisent, je vois ce module comme le manuel de potions du Prince de Sang-MĂȘlĂ© dans Harry Potter, un recueil de connaissances que l’on va pouvoir annoter graçe Ă  nos diverses experiences.

6. Kickstart du MVP

DĂ©marrage officiel en production mĂȘme si j’espĂšre que des premiers utilisateurs auront dĂ©jĂ  commencĂ© a s’approprier l’outil au cours du dĂ©veloppement du MVP.


🔐 Focus technique : Authentification et choix d’architecture

Quand on manipule des donnĂ©es RH, la sĂ©curitĂ© est non nĂ©gociable (non, personne n’aura accĂšs Ă  la base de prod 😜).
La premiĂšre brique posĂ©e cĂŽtĂ© technique, c’est donc l’authentification via Google OAuth2.

Mini ADR – Google OAuth vs Firebase Auth

Si tu as vu mon talk sur la Hype tu sais que les ADR c’est mon kiff, et j’ai donc profiter de l’occasion pour te faire un exemple 👇.

Contexte

Pour Pathfinder, on a besoin d’un systĂšme d’authentication sĂ©curisĂ© pour que les JetPeople puissent se connecter via leur compte Google — une maniĂšre simple et centralisĂ©e de gĂ©rer les accĂšs.

Plusieurs options on été envisagées :

  1. Firebase Authentication : SDK cotĂ© frontend + VĂ©rification cotĂ© backend via l’Admin SDK)
  2. Google Oauth2 - Utilisation du token Google : Auth.js Authorization Code avec PKCE coté NextJS et Verification cÎté NestJS
  3. Google Oauth2 - Token custom : Authentication gérée complÚtement dans par back-end avec notre propre logique de gestion de session / refresh tokens grùce notamment à @nestjs/jwt et Passport.

Comparatif

OptionAvantagesInconvénients
1. Firebase Authentication✅ IntĂ©gration rapide
✅ Pleins d’exemples chez Jetdev
✅ Dashboard de gestion intĂ©grĂ©
⚠ DĂ©pendances supplĂ©mentaires
❌ Vendor lock-in (Firebase)
❌ On n’a besoin que de la partie Google
2. Google OAuth2 — Token Google (PKCE)✅ Standard OAuth2
✅ IntĂ©gration rapide avec Next.js (Auth.js)
✅ Pas de projet firebase à maintenir
⚠ Moins de contrĂŽle sur les sessions/tokens
⚠ Un token Google circle entre le back et front (pas idĂ©al)
3. Google OAuth2 — Token custom (backend-controlled)✅ Contrîle total (JWT, refresh tokens, rîles)
✅ Base pour auth centralisĂ©e multi-apps
✅ Pas de projet firebase à maintenir
❌ Plus complexe à mettre en Ɠuvre
❌ NĂ©cessite une logique de session robuste cĂŽtĂ© backend

Décision

AprĂšs comparaison, j’ai optĂ© pour la solution 2, qui offre un bon compromis entre rapiditĂ© de mise en place et Ă©volutivitĂ©.

Cette solution repose sur :

  • L’utilisation de Auth.js cĂŽtĂ© Next.js pour gĂ©rer le flow OAuth2 avec PKCE.
  • La rĂ©cupĂ©ration de l’id_token Google lors du login.
  • L’envoi de l’id_token dans le header Authorization pour chaque appel frontend → backend.
  • Une vĂ©rification du token cĂŽtĂ© NestJS, via la bibliothĂšque google-auth-library.

Pourquoi avoir fait ce choix ?

  • IntĂ©gration super rapide (ndlr: j’ai mis une bonne heure de taf).
  • Pas besoin de gĂ©rer et intĂ©grer la partie Firebase (mĂȘme s’il ne s’agit pas d’une grosse charge).
  • Je suis ok avec le fait que le backend n’émet pas de JWT interne : il fait confiance au token Google directement.

Une solution simple mais extensible avec la possibilitĂ© d’évoluer vers une stratĂ©gie de tokens personnalisĂ©s plus tard si besoin.

Voici le flow complet : auth.png

Comment on implémente ça ?

Coté Next.js

  • CrĂ©ation d’un OAuth 2.0 Client ID dans la console Google Cloud
  • Mise en place de Auth.JS avec le provider Google en suivant le guide
  • Ajout de callbacks pour rendre l’id token dispo dans la session JWT
  • Ajout d’une callback sur le sign pour synchroniser l’utilisateur dans le backend
export const { handlers, signIn, signOut, auth } = NextAuth({
  providers: [Google],
  callbacks: {
    async signIn({ profile }) {
      const res = await fetch(
        `${process.env.BACKEND_URL}/auth/internal/users/sync`,
        {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
            Authorization: `Bearer ${process.env.INTERNAL_SECRET}`,
          },
          body: JSON.stringify({
            providerId: profile?.sub,
            email: profile?.email,
            firstName: profile?.given_name,
            lastName: profile?.family_name,
          }),
        },
      );

      return res.ok;
    },
    async jwt({ token, account }) {
      if (account?.id_token) {
        token.idToken = account.id_token;
      }
      return token;
    },
    async session({ session, token }) {
      session.idToken = token.idToken;
      return session;
    },
  },
});

Coté NestJS

  • Ajout d’un AuthModule dans l’API
  • CrĂ©ation d’un Guard qui utilise google-auth-library pour vĂ©rifier le token
@Injectable()
export class GoogleAuthGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (isPublic) {
      return true;
    }

    const request: Request = context.switchToHttp().getRequest();
    const authHeader = request.headers["authorization"];

    if (!authHeader || authHeader.startsWith("Bearer ")) {
      throw new UnauthorizedException(
        "Missing or invalid Authorization header",
      );
    }

    const idToken = authHeader.split(" ")[1];

    try {
      const ticket = await client.verifyIdToken({
        idToken,
        audience: process.env.GOOGLE_CLIENT_ID,
      });

      const payload = ticket.getPayload();

      if (!payload || !payload.email) {
        throw new UnauthorizedException("Invalid token payload");
      }

      request["user"] = {
        email: payload.email,
        sub: payload.sub,
        name: payload.name,
        picture: payload.picture,
      };

      return true;
    } catch (error) {
      throw new UnauthorizedException("Invalid Google ID Token");
    }
  }
}

Ce que ça apporte au projet

  • Authentification sĂ©curisĂ©e et centralisĂ©e
  • Gestion des utilisateurs synchronisĂ©e entre frontend et backend
  • Base prĂȘte pour restreindre des fonctionnalitĂ©s ou visualiser un espace personnel

Pistes d’amĂ©lioration

Changement de la stratégie de session

Auth.js propose deux stratégies de session, la stratégie basée sur les JWT est actuellement mise en place, car elle ne nécessite pas de connexion à la base de donnée, ce qui permet de conserver NestJS comme unique connexion à la base de donnée.

Basculer sur la stratĂ©gie base de donnĂ©e nous permettrait de limiter l’exposition des tokens et d’ajouter des features comme pouvoir invalider des sessions (sign out everywhere par exemple).


💬 Prochain devlog :

Je vous parlerai des trajectoires de carriĂšre chez Jetdev et de la stratĂ©gie de tests ✹ Rejoins le salon #pathfinder-discovery pour suivre l’aventure et n’hĂ©site pas consulter le projet sur Github 🚀


Related Posts

Devlog #0 – A new beginning

Devlog #0 – A new beginning

👋 Bienvenue sur le Devlog ! Bonjour Ă  toi cher membre de la JetTeam, et bienvenue sur ce devlog qui me sert, tel un journal de bord Ă  documenter l'avancĂ©e et les choix fait sur Pathfinder. A ch

read more