sql >> Base de Datos >  >> NoSQL >> MongoDB

Autenticación de aplicaciones NodeJS y MongoDB por JWT

En este blog, implementaremos la autenticación con JWT en una aplicación web NodeJS. Para esto, usaremos jsonwebtoken paquete

¿Qué es JWT?

JWT (JSON Web Token) es un formato de token. Está firmado digitalmente, es autónomo y compacto. Proporciona un mecanismo conveniente para transferir datos. JWT no es intrínsecamente seguro, pero el uso de JWT puede garantizar la autenticidad del mensaje siempre que se verifique la firma y se pueda garantizar la integridad de la carga útil. JWT se usa a menudo para la autenticación sin estado en casos de uso simples que involucran sistemas no complejos.

Aquí hay un ejemplo de JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Ahora, vamos a autenticar/proteger algunas rutas.

Requisitos previos:

  • Conocimientos básicos de HTML/JavaScript
  • NodeJS debe estar instalado en su sistema.
  • módulo express para la creación del servidor.
  • módulo mongoose para conexión y consultas MongoDB.
  • módulo bcrypt para hash.

puede instalar todos los paquetes requeridos usando el siguiente comando:

npm install express mongoose bcrypt  --save

Paso 1. Primero, cree una estructura de directorios como se muestra a continuación:

JWTApp

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

Paso 2. Instale “jsonwebtoken ” paquete usando el siguiente comando

 npm install jsonwebtoken -- save

Paso 3. Crear el modelo de usuario

En la carpeta api/models, cree un archivo llamado usuario userModel.js ejecutando touch api/models/userModel.js.

En este archivo, cree un esquema de mangosta con las siguientes propiedades:

  • nombre completo
  • dirección de correo electrónico
  • contraseña
  • la fecha de creación

Agrega el siguiente código

'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);

Paso 4. Crear los controladores de usuarios

En la api/controladores carpeta, cree un archivo llamado usuario userController.js ejecutando touch api/controllers/userController.js

En el archivo userController, cree tres controladores diferentes para manejar usando el siguiente código

'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' });
  }
};

Nota: Se guardó una contraseña hash en la base de datos usando bcrypt.

Paso 6. En la api/ruta carpeta, cree un archivo llamado user userRoute.js y agregue el siguiente código:

'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);
};

Paso 7. Agregue el siguiente código en 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;

Paso 9. Ahora solo necesita ejecutar el proyecto usando el siguiente comando e intentar iniciar sesión usando el JWT.

npm start

Paso 10. Abra Postman y cree una solicitud de publicación para localhost:3000/auth/register como sigue:

Paso 11. Después de esto, iniciemos sesión con esta URL localhost:3000/auth/sign_in . Introduzca las claves y los valores de correo electrónico y contraseña

Debajo del valor, agregue JWT y el token con un espacio entre ellos, así:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Paso 11. Luego, ingrese los parámetros para la clave y el valor para obtener el perfil. Desea crear como se muestra a continuación y enviar:

Como hemos visto, es bastante fácil construir un sistema de autenticación JWT con NodeJS. Puede encontrar el código completo utilizado en este tutorial aquí.

Nota:puede decodificar o verificar los detalles de su token JWT con esta herramienta