Skip to content

Instantly share code, notes, and snippets.

@MiscMag101
Last active December 4, 2018 20:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MiscMag101/5e5f90c0cfdd6bfd4862e0e44de94b06 to your computer and use it in GitHub Desktop.
Save MiscMag101/5e5f90c0cfdd6bfd4862e0e44de94b06 to your computer and use it in GitHub Desktop.

Problème 6: RESTful

Les instructions suivantes indiquent les modifications à apporter au Prototype de niveau 3 pour atteindre le Prototype de niveau 4.

Etape 1 : Installation des paquets

$ npm install --save jsonwebtoken passport-http-bearer

Etape 2 : Création des jetons

Après le processus d’authentification OAuth2, l’application devra transmettre à l’utilisateur un jeton au format JWT. Pour cela, nous modifions le fichier /routes/signin.js de notre prototype :

// Import JWT module
const jwt = require('jsonwebtoken');

...

app.get('/signin/github/callback',
  passport.authenticate('github', {session: false}),

  // Issue JSON Web Token
  function(req, res) {

    // define the token payload
    let payload = {id: req.user.id, username: req.user.username}

    // sign the token
    let token = jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h', algorithm: 'HS512'});

    // send the token
    res.send("Your token is: " + token);
  }

);

Après authentification, le prototype créera un jeton au format JWT que l’utilisateur devra utiliser dans chaque requête.

Dans le prototype proposé, les jetons sont signés avec un algorithme de signature symétrique (HMAC SHA 512). Si votre application doit contrôler des JWT émis par un serveur d’autorisation tiers, il faudra utiliser une signature asymétrique (exemple : ES256).

Etape 3: Configuration de passport

Nous allons configurer une seconde stratégie pour prendre en compte les jetons JWT dans le fichier config/MyPassport.js. L’utilisateur devra transmettre ce jeton dans chacune de ses requêtes dans l’entête HTTP “Authorization”.

// Import HTTP Bearer Strategy for Passport
MyBearerStrategy = require('passport-http-bearer').Strategy;

// Import JWT module
const jwt = require('jsonwebtoken');

// Configure the new HTTP Bearer Strategy for Passport
MyPassport.use(new MyBearerStrategy(

  function (token, done) {
    
    // Check JWT
    jwt.verify(token, process.env.JWT_SECRET, function(err, payload) {
      
      // If checking failed
      if (err) {
        return done(err)
      };
      
      // If user is empty
      if (!payload){
        return done(null, false);
      }
      
      // If everything all right, the user will be authenticated
      return done(null, payload);
      
  });
}));

La fonction de vérification permet d’effectuer les contrôles nécessaires sur le jeton : la signature doit être valide et la date d’expiration ne doit pas être dépassée.

Etape 4: Configurer l’application

Nous devons maintenant modifier la configuration (fichier app.js) des routes privées pour prendre en compte l’authentification par jeton :

const PrivateRouter = require('./routes/private.js');
app.use('/private', MyPassport.authenticate('bearer', {session: false}), PrivateRouter);

Pour tester cette route, il faudra récupérer votre jeton obtenu après authentification (signin/github) puis exécuter la commande suivante en remplaçant TOKEN par la valeur de votre jeton :

curl -i http://localhost:3000/private/greeting -H "Authorization: Bearer TOKEN"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment