Voici une alternative au célèbre package passport : JWT.
JSON Web Token, JWT pour les intimes - que les anglophones prononcent 'djot' - est une spécification pour l'authentification. Un JWT est un objet JSON encodé qu'un serveur (Node par exemple) encode en utilisant une clé privée. L'objet JSON encodé est un token que vous enverrez à un client qui s'est authentifié avec succès. Ledit client l'enverra ensuite au serveur à chaque requête faite à ce même serveur. Si en utilisant sa clé privée le serveur parvient à décoder le token, le serveur sait que le client qui a joint ce token est bien celui qu'il est censé être. Le serveur pourra alors authoriser le client à accéder aux resources demandées par le client.
Partons du principe que vous voulez implémenter JWT dans une application Express. Deux packages suffisent. Dans votre console :
npm install jsonwebtoken
npm install express-jwt
Dans votre JavaScript côté serveur :
var jwt = require('jsonwebtoken');
var expressJwt = require('express-jwt');
express-jwt va intercepter toutes les requêtes entrantes, desquelles il va récupérer dans le header 'Authorization: Bearer ...', puis va décoder le token avec le secret.
La méthode unless() permet de ne pas demander de token. En effet, lors d'une requête sur la route '/login', l'utilisateur n'étant pas encore loggué, on sait qu'il n'a pas encore de token.
var mySecret = 'blablabla';
app.use(expressJwt({ secret: mySecret }).unless({ path: [ '/login' ]}));
app.get('/myprotectedpage', function(req, res){
var mySensitiveData = {
prop1: 'Bla bla confiendential',
prop2: 'Bli bli even more confidential'
};
res.json(mySensitiveData);
})
Vient ensuite la création et l'envoi d'un token au client lorsqu'il se connecte. C'est à la methode sign() que revient de de créer notre token. L'objet passé en premier paramètre à sign() va être encodé. Le second paramètre est le secret. Enfin, notre token va être envoyé au client, token auquel pourra être joint toute autre donnée de votre choix par l'ajout de propriétés supplémentaires (dans notre exemple 'otherPro') :
app.post('/login', function (req, res) {
// Ici on vérifierait que le login et mot de passe sont corrects
.
.
// création d'un token
var token = jwt.sign({
username: 'toto'
}, jwtSecret);
var otherPro = 'blibli';
res.send({
token: token,
otherPro: otherPro
});
});
Charge à vous, côté client, d' ajouter le token au header de chaque requête, via un interceptor angular par exemple. Pour rappel, un interpector se déclare après le tableau des dépendances ([]), en 3ème paramètre ci-dessous, et a besoin que l'on injecte $httpProvider. myAuthInterceptor sera une simple factory que l'on ajoutera au tableau 'interceptors'.
var app = angular.module('app', [], function config($httpProvider) {
$httpProvider.interceptors.push('myAuthInterceptor');
});
Edit : 86 minutes de cours consacrés à JWT dans notre cours Node.js et Express.js par la pratique.