sql >> Databáze >  >> NoSQL >> MongoDB

Autentizace aplikací NodeJS a MongoDB pomocí JWT

V tomto blogu budeme implementovat ověřování pomocí JWT ve webové aplikaci NodeJS. K tomu budeme používat jsonwebtoken balíček

Co je JWT?

JWT (JSON Web Token) je formát tokenu. Je digitálně podepsaný, samostatný a kompaktní. Poskytuje pohodlný mechanismus pro přenos dat. JWT není ze své podstaty bezpečné, ale použití JWT může zajistit autenticitu zprávy, pokud je ověřen podpis a může být zaručena integrita obsahu. JWT se často používá pro bezstavovou autentizaci v jednoduchých případech použití zahrnujících nekomplexní systémy.

Zde je příklad JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Nyní pojďme ověřit/chránit některé trasy.

Předpoklady:

  • Základní znalost HTML/JavaScript
  • NodeJS by měl být nainstalován ve vašem systému.
  • expresní modul pro vytvoření serveru.
  • modul mongoose pro připojení a dotazy MongoDB.
  • modul bcrypt pro hašování.

všechny požadované balíčky můžete nainstalovat pomocí následujícího příkazu:

npm install express mongoose bcrypt  --save

Krok 1. Nejprve vytvořte adresářovou strukturu, jak je uvedeno níže:

JWTApp

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

Krok 2. Instalace „jsonwebtoken ” package pomocí následujícího příkazu

 npm install jsonwebtoken -- save

Krok 3. Vytvořte uživatelský model

Ve složce api/models vytvořte soubor s názvem user userModel.js spuštěním touch api/models/userModel.js.

V tomto souboru vytvořte mongoose schéma s následujícími vlastnostmi:

  • celé jméno
  • e-mailovou adresu
  • heslo
  • datum vytvoření

Přidejte následující kód

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

Krok 4. Vytvořte uživatelské ovladače

V api/controllers složku, vytvořte soubor s názvem user userController.js spuštěním touch api/controllers/userController.js

V souboru userController vytvořte tři různé obslužné rutiny ke zpracování pomocí následujícího kódu

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

Poznámka: Hash heslo bylo uloženo do databáze pomocí bcrypt.

Krok 6. V api/route vytvořte soubor s názvem user userRoute.js a přidejte následující kód:

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

Krok 7. Přidejte následující kód do 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;

Krok 9. Nyní stačí spustit projekt pomocí následujícího příkazu a zkusit protokolování pomocí JWT.

npm start

Krok 10. Otevřete Postman a vytvořte požadavek na příspěvek na localhost:3000/auth/register jak je uvedeno níže:

Krok 11. Poté se podepišme pomocí této adresy URL localhost:3000/auth/sign_in . Zadejte klíče a hodnoty pro e-mail a heslo

Pod hodnotu přidejte JWT a token s mezerou mezi nimi, například takto:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Krok 11. Poté zadejte parametry pro klíč a hodnotu pro načtení profilu. Chcete vytvořit, jak je uvedeno níže, a odeslat:

Jak jsme viděli, je poměrně snadné vytvořit autentizační systém JWT s NodeJS, kompletní kód použitý v tomto tutoriálu najdete zde.

Poznámka:Pomocí tohoto nástroje můžete dekódovat nebo ověřit podrobnosti o tokenu JWT


  1. Vysoce výkonné clustery MongoDB v Azure

  2. Jak zabezpečit ClusterControl Server

  3. Zkrácení UUID

  4. Redis - Indexy s prošlou platností se nesmažou