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
- http://passportjs.org/docs
- https://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport–cms-21619
- https://scotch.io/tutorials/easy-node-authentication-setup-and-local
- https://blog.risingstack.com/node-hero-node-js-authentication-passport-js/
- https://www.youtube.com/watch?v=gYjHDMPrkWU
- https://www.youtube.com/watch?v=Z1ktxiqyiLA
- http://mherman.org/blog/2015/01/31/local-authentication-with-passport-and-express-4/#.WcQpjOBx30o