MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Authentification des applications NodeJS et MongoDB par JWT

Dans ce blog, nous allons implémenter l'authentification avec JWT dans une application Web NodeJS. Pour cela, nous utiliserons jsonwebtoken paquet

Qu'est-ce que JWT ?

JWT (JSON Web Token) est un format de jeton. Il est signé numériquement, autonome et compact. Il fournit un mécanisme pratique pour transférer des données. JWT n'est pas intrinsèquement sécurisé, mais l'utilisation de JWT peut garantir l'authenticité du message tant que la signature est vérifiée et que l'intégrité de la charge utile peut être garantie. JWT est souvent utilisé pour l'authentification sans état dans des cas d'utilisation simples impliquant des systèmes non complexes.

Voici un exemple de JWT :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Maintenant, authentifions/protégeons certaines routes.

Pré-requis :

  • Connaissance de base de HTML/JavaScript
  • NodeJS doit être installé sur votre système.
  • module express pour créer le serveur.
  • module mongoose pour la connexion et les requêtes MongoDB.
  • module bcrypt pour le hachage.

vous pouvez installer tous les packages requis en utilisant la commande suivante :

npm install express mongoose bcrypt  --save

Étape 1. Tout d'abord, créez une structure de répertoires comme ci-dessous :

JWTApp

-api
--models
----userModel.js
--controllers
----userController.js
--route
----userRoute.js
--server.js

Étape 2. Installez "jsonwebtoken ” package en utilisant la commande suivante

 npm install jsonwebtoken -- save

Étape 3. Créer le modèle utilisateur

Dans le dossier api/models, créez un fichier appelé user userModel.js en exécutant touch api/models/userModel.js.

Dans ce fichier, créez un schéma mangouste avec les propriétés suivantes :

  • nomcomplet
  • adresse e-mail
  • mot de passe
  • la date de création

Ajoutez le code suivant

'use strict';

var mongoose = require('mongoose'),
  bcrypt = require('bcrypt'),
  Schema = mongoose.Schema;

/**
 * User Schema
 */
var UserSchema = new Schema({
  fullName: {
    type: String,
    trim: true,
    required: true
  },
  email: {
    type: String,
    unique: true,
    lowercase: true,
    trim: true,
    required: true
  },
  hash_password: {
    type: String
  },
  created: {
    type: Date,
    default: Date.now
  }
});

UserSchema.methods.comparePassword = function(password) {
  return bcrypt.compareSync(password, this.hash_password);
};

mongoose.model('User', UserSchema);

Étape 4. Créez les gestionnaires d'utilisateurs

Dans api/controllers dossier, créez un fichier appelé user userController.js en exécutant touch api/controllers/userController.js

Dans le fichier userController, créez trois gestionnaires différents à gérer en utilisant le code suivant

'use strict';

var mongoose = require('mongoose'),
  jwt = require('jsonwebtoken'),
  bcrypt = require('bcrypt'),
  User = mongoose.model('User');

exports.register = function(req, res) {
  var newUser = new User(req.body);
  newUser.hash_password = bcrypt.hashSync(req.body.password, 10);
  newUser.save(function(err, user) {
    if (err) {
      return res.status(400).send({
        message: err
      });
    } else {
      user.hash_password = undefined;
      return res.json(user);
    }
  });
};

exports.sign_in = function(req, res) {
  User.findOne({
    email: req.body.email
  }, function(err, user) {
    if (err) throw err;
    if (!user || !user.comparePassword(req.body.password)) {
      return res.status(401).json({ message: 'Authentication failed. Invalid user or password.' });
    }
    return res.json({ token: jwt.sign({ email: user.email, fullName: user.fullName, _id: user._id }, 'RESTFULAPIs') });
  });
};

exports.loginRequired = function(req, res, next) {
  if (req.user) {
    next();
  } else {

    return res.status(401).json({ message: 'Unauthorized user!!' });
  }
};
exports.profile = function(req, res, next) {
  if (req.user) {
    res.send(req.user);
    next();
  } 
  else {
   return res.status(401).json({ message: 'Invalid token' });
  }
};

Remarque : Un mot de passe de hachage a été enregistré dans la base de données à l'aide de bcrypt.

Étape 6. Dans api/route dossier, créez un fichier appelé user userRoute.js et ajoutez le code suivant :

'use strict';
module.exports = function(app) {
    var userHandlers = require('../controllers/userController.js');
    // todoList Routes
    app.route('/tasks')
        .post(userHandlers.loginRequired, userHandlers.profile);
    app.route('/auth/register')
        .post(userHandlers.register);
   app.route('/auth/sign_in')
        .post(userHandlers.sign_in);
};

Étape 7. Ajoutez le code suivant dans server.js

'use strict';

var express = require('express'),
  app = express(),
  port = process.env.PORT || 3000,


  User = require('./api/models/userModel'),
  bodyParser = require('body-parser'),
  jsonwebtoken = require("jsonwebtoken");

const mongoose = require('mongoose');
const option = {
    socketTimeoutMS: 30000,
    keepAlive: true,
    reconnectTries: 30000
};

const mongoURI = process.env.MONGODB_URI;
mongoose.connect('mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb', option).then(function(){
    //connected successfully
}, function(err) {
    //err handle
});

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.use(function(req, res, next) {
  if (req.headers && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'JWT') {
    jsonwebtoken.verify(req.headers.authorization.split(' ')[1], 'RESTFULAPIs', function(err, decode) {
      if (err) req.user = undefined;
      req.user = decode;
      next();
    });
  } else {
    req.user = undefined;
    next();
  }
});
var routes = require('./api/routes/userRoutes');
routes(app);

app.use(function(req, res) {
  res.status(404).send({ url: req.originalUrl + ' not found' })
});

app.listen(port);

console.log(' RESTful API server started on: ' + port);

module.exports = app;

Étape 9. Il vous suffit maintenant d'exécuter le projet à l'aide de la commande suivante et d'essayer de vous connecter à l'aide du JWT.

npm start

Étape 10. Ouvrez Postman et créez une demande de publication à localhost:3000/auth/register comme ci-dessous :

Étape 11. Après cela, signons avec cette URL localhost:3000/auth/sign_in . Entrez les clés et les valeurs pour l'email et le mot de passe

Sous la valeur, ajoutez JWT et le jeton avec un espace entre, comme ceci :

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Étape 11. Ensuite, entrez les paramètres de la clé et de la valeur pour récupérer le profil. Vous souhaitez créer comme indiqué ci-dessous et envoyer :

Comme nous l'avons vu, il est assez facile de construire un système d'authentification JWT avec NodeJS, vous pouvez trouver le code complet utilisé dans ce tutoriel ici.

Remarque :Vous pouvez décoder ou vérifier les détails de votre jeton JWT avec cet outil