Votre PassPort !

PassPort

PassPort est un middleware NodeJs qui s’occupe d’authentifier un utilisateur. Comme je fais du NodeJS depuis quelques temps et qu’après quelques recherches, je me suis rendu compte que ce middelware était assez populaire : c’est parti pour aujourd’hui !

Objectifs

Comprendre et mettre en place PassPort dans un projet “existant”. Je dis “existant” car c’est vraiment un tout début de quelque chose.

Un peu de lecture …

Comme d’habitude, je commence par un peu de Lecture et de Visionnage. Cf. les liens

C’est parti !

Dépendances

Dans le cadre de mon projet, j’ai besoin d’installer différentes dépendances :

  • passport : le middleware utilisé ici,
  • passport-local : la stratégie qui sera employée,
  • connect-flash : gestion de message via une session,
  • bcrypt-nodejs : pour la sécurisation des mots de passe
  • cookie-parser : le nom est assez clair,
  • express-session : idem.

Précision sur les stratégies : un élément intéressant de Passport est qu’il met à disposition différents moyen de s’identifier et intègre par exemple des moyens de connexion via un compte Google, Facebook ou autres. Ici, je me mets en mode local pour commencer.

Premières configurations

Quelques premiers petites configurations :

app.use(
        session({ 
            secret: config.app.secret 
            , resave: false
            , saveUninitialized: false
        })
    ); // session info
app.use(passport.initialize());
app.use(passport.session()); // Passage de express-session à Passport qui va s'en servir dans notre cas pour stocker les infos
app.use(flash()); // C'est connect-flash qui sera utilisé pour stocker des messages dans les sessions

Pour le secret, il est calculé à chaque chargement de l’application : const crypto = require('crypto').randomBytes(256).toString('hex');. Cela m’évite d’avoir une phrase en dur dans le code.

Enregistrement

Le principe est assez “simple” : il faut créer paramétrer la stratégie de manière à ce que Passport puisse se charger du passage des informations. Les différents tutos et la documentation présentent bien ce qu’il y a à faire. Un galère quand même (qui m’a bien fait perdre quelques bonnes minutes) : les champs de formulaire doivent paramétré avec name et pas uniquement id …

Pour la mise en place, j’ai suivi le conseil d’un des exemples, j’ai crée un fichier qui contient les différentes méthodes dédiés à Passport : passport.js. C’est dans celui-ci que j’ai centralisé :

  • Les fonctions de sérialization et désérialization : nécessaire pour le stockage en session ou la récupération,
  • La fonction d’enregistrement
  • La fonction de login

Quelques exemples de code :
Une configuration passport pour l’enregistrement :

/**
 * Enregistrement de l'utilisateur
 */
passport.use('local-register'
        , new LocalStrategy({
                passReqToCallback : true
            }
            , function(req, email, password, done){
                process.nextTick(function() {
                    // Gestion du compte
                    var newAccount = new Account();
                    newAccount.email = email;
                    newAccount.username = req.param('username');
                    newAccount.password = password; // pas besoin de crypté ici, c'est géré (normalement) par un hook sur la classe Account

                    // Save
                    newAccount.save( (err, newAccountSaved) => {
                        if(err) throw err; // TODO : améliorer la gestion d'erreur
                        return done(null, newAccountSaved);
                    });
                }); // /process.nextTick
            } // /function(req, email, password, done){
    ) // new LocalStrategy
); // /local-register

L’enregistrement de la route

router.post('/register', passport.authenticate('local-register', {
    successRedirect : '/people', 
    failureRedirect : '/register', 
    failureFlash : true // Pour afficher les messages d'erreur
}));

Login

Fonctionne de la même manière mais adapté au login :

  • Enregistrement d’une stratégie “local-login”
  • Ajout d’une route

Bilan

Bilan mitigé. D’un côté, il y a des choses intéressantes qui sont gérés comme la mise à disposition du User directement dans la requête (même s’il faut gérer la récupération manuellement). D’un autre côté, finalement, tout est géré manuellement. Passport vient juste simplifier (et c’est déjà beaucoup) l’intégration dans l’application.

Je pense que pour bien voir l’intérêt, il faut sans doute intégrer d’autres stratégie mais çà : c’est pour un autre demain.

Liens