MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Удостоверяване на приложението NodeJS и MongoDB от JWT

В този блог ще внедрим удостоверяване с JWT в уеб приложение на NodeJS. За това ще използваме jsonwebtoken пакет

Какво е JWT?

JWT (JSON Web Token) е формат на токен. Той е цифрово подписан, самостоятелен и компактен. Предоставя удобен механизъм за прехвърляне на данни. JWT по своята същност не е защитен, но използването на JWT може да гарантира автентичността на съобщението, стига подписът да е проверен и целостта на полезния товар може да бъде гарантирана. JWT често се използва за удостоверяване без състояние при прости случаи на използване, включващи несложни системи.

Ето пример за JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Сега нека удостоверим/защитим някои маршрути.

Предварителни изисквания:

  • Основни познания по HTML/JavaScript
  • NodeJS трябва да бъде инсталиран във вашата система.
  • експресен модул за създаване на сървъра.
  • модул mongoose за връзка с MongoDB и заявки.
  • bcrypt модул за хеширане.

можете да инсталирате всички необходими пакети, като използвате следната команда:

npm install express mongoose bcrypt  --save

Стъпка 1. Първо, създайте структура на директория, както е показано по-долу:

JWTApp

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

Стъпка 2. Инсталирайте „jsonwebtoken ” пакет, като използвате следната команда

 npm install jsonwebtoken -- save

Стъпка 3. Създайте потребителския модел

В папката api/models създайте файл с име user userModel.js, като стартирате touch api/models/userModel.js.

В този файл създайте схема на мангуста със следните свойства:

  • пълно име
  • имейл адрес
  • парола
  • дата на създаване

Добавете следния код

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

Стъпка 4. Създайте манипулаторите за потребители

В api/контролерите папка, създайте файл, наречен user userController.js, като стартирате touch api/controllers/userController.js

Във файла userController създайте три различни манипулатори за обработка, като използвате следния код

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

Забележка: Хеш парола беше запазена в базата данни с помощта на bcrypt.

Стъпка 6. Вapi/маршрута папка, създайте файл, наречен потребител userRoute.js и добавете следния код:

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

Стъпка 7. Добавете следния код в 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;

Стъпка 9. Сега просто трябва да стартирате проекта, като използвате следната команда и опитайте да влезете с помощта на JWT.

npm start

Стъпка 10. Отворете Postman и създайте заявка за публикуване до localhost:3000/auth/register както е по-долу:

Стъпка 11. След това нека да подпишем с този URL localhost:3000/auth/sign_in . Въведете ключовете и стойностите за имейл и парола

Под стойността добавете JWT и маркера с интервал между тях, както следва:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Стъпка 11. След това въведете параметрите за ключа и стойността за извличане на профила. Искате да създадете както е показано по-долу и да изпратите:

Както видяхме, е сравнително лесно да се изгради JWT система за удостоверяване с NodeJS, можете да намерите пълния код, използван в този урок тук.

Забележка:Можете да декодирате или потвърдите подробностите за вашия JWT токен с този инструмент


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $isNumber

  2. Подигравателна база данни в node.js?

  3. Големи работни потоци от данни с помощта на панди

  4. Твърде много отворени файлове, като същевременно осигурите индекс mongo

  5. MongoDB $ne оператор на конвейер за агрегиране