MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Autenticação de aplicativos NodeJS e MongoDB por JWT


Neste blog, estaremos implementando a autenticação com JWT em um aplicativo web NodeJS. Para isso, usaremos jsonwebtoken pacote

O que é JWT?


JWT (JSON Web Token) é um formato de token. É assinado digitalmente, independente e compacto. Ele fornece um mecanismo conveniente para a transferência de dados. O JWT não é inerentemente seguro, mas o uso do JWT pode garantir a autenticidade da mensagem, desde que a assinatura seja verificada e a integridade da carga útil possa ser garantida. O JWT é frequentemente usado para autenticação sem estado em casos de uso simples envolvendo sistemas não complexos.

Veja um exemplo de JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Agora, vamos autenticar/proteger algumas rotas.

Pré-requisitos:
  • Conhecimentos básicos de HTML/JavaScript
  • O NodeJS deve ser instalado em seu sistema.
  • módulo expresso para criar o servidor.
  • módulo mongoose para conexão e consultas do MongoDB.
  • módulo bcrypt para hash.

você pode instalar todos os pacotes necessários usando o seguinte comando:
npm install express mongoose bcrypt  --save

Etapa 1. Primeiro, crie uma estrutura de diretórios conforme abaixo:

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

Etapa 2. Instale o “jsonwebtoken ” usando o seguinte comando

 npm install jsonwebtoken -- save

Etapa 3. Criar o modelo de usuário


Na pasta api/models, crie um arquivo chamado user userModel.js executando touch api/models/userModel.js.

Neste arquivo, crie um esquema de mangusto com as seguintes propriedades:
  • nomecompleto
  • endereço de e-mail
  • senha
  • a data de criação

Adicione o seguinte 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);

Etapa 4. Crie os manipuladores de usuário


Na api/controllers pasta, crie um arquivo chamado user userController.js executando touch api/controllers/userController.js

No arquivo userController, crie três manipuladores diferentes para manipular usando o seguinte 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' });
  }
};

Observação: Uma senha de hash foi salva no banco de dados usando bcrypt.

Etapa 6. Na api/route pasta, crie um arquivo chamado user userRoute.js e adicione o seguinte 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);
};

Etapa 7. Adicione o seguinte código em 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;

Etapa 9. Agora você só precisa executar o projeto usando o comando a seguir e tentar logar usando o JWT.
npm start

Etapa 10. Abra o Postman e crie uma solicitação de postagem para localhost:3000/auth/register como abaixo:



Etapa 11. Depois disso, vamos assinar com este URL localhost:3000/auth/sign_in . Insira as chaves e valores para e-mail e senha



Sob o valor, adicione JWT e o token com um espaço entre, assim:
JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Etapa 11. Em seguida, insira os parâmetros para a chave e o valor para buscar o perfil. Você deseja criar como mostrado abaixo e enviar:



Como vimos, é bastante fácil construir um sistema de autenticação JWT com NodeJS, você pode encontrar o código completo usado neste tutorial aqui.

Observação:você pode decodificar ou verificar os detalhes do seu token JWT com esta ferramenta