MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Uwierzytelnianie aplikacji NodeJS i MongoDB przez JWT

W tym blogu będziemy wdrażać uwierzytelnianie za pomocą JWT w aplikacji internetowej NodeJS. W tym celu użyjemy jsonwebtoken pakiet

Co to jest JWT?

JWT(JSON Web Token) to format tokena. Jest podpisany cyfrowo, samowystarczalny i kompaktowy. Zapewnia wygodny mechanizm przesyłania danych. JWT nie jest z natury bezpieczny, ale użycie JWT może zapewnić autentyczność komunikatu, o ile podpis jest weryfikowany i można zagwarantować integralność ładunku. JWT jest często używany do uwierzytelniania bezstanowego w prostych przypadkach użycia obejmujących nieskomplikowane systemy.

Oto przykład JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Teraz uwierzytelnijmy/chrońmy niektóre trasy.

Wymagania wstępne:

  • Podstawowa znajomość HTML/JavaScript
  • NodeJS powinien być zainstalowany w twoim systemie.
  • moduł ekspresowy do tworzenia serwera.
  • moduł mangusty do połączeń i zapytań MongoDB.
  • moduł bcrypt do haszowania.

możesz zainstalować wszystkie wymagane pakiety za pomocą następującego polecenia:

npm install express mongoose bcrypt  --save

Krok 1. Najpierw utwórz strukturę katalogów jak poniżej:

JWTApp

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

Krok 2. Zainstaluj „jsonwebtoken ” pakiet za pomocą następującego polecenia

 npm install jsonwebtoken -- save

Krok 3. Utwórz model użytkownika

W folderze api/models utwórz plik o nazwie user userModel.js, uruchamiając touch api/models/userModel.js.

W tym pliku utwórz schemat mangusty o następujących właściwościach:

  • imię i nazwisko
  • adres e-mail
  • hasło
  • data utworzenia

Dodaj następujący kod

'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. Utwórz procedury obsługi użytkownika

W interfejsach API/kontrolerach folderu, utwórz plik o nazwie user userController.js, uruchamiając touch api/controllers/userController.js

W pliku userController utwórz trzy różne programy obsługi do obsługi za pomocą następującego kodu

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

Uwaga: Hasło hash zostało zapisane w bazie danych przy użyciu bcrypt.

Krok 6. W interfejsie API/trasie folderu, utwórz plik o nazwie user userRoute.js i dodaj następujący kod:

'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. Dodaj następujący kod w 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. Teraz wystarczy uruchomić projekt za pomocą następującego polecenia i spróbować zalogować się za pomocą JWT.

npm start

Krok 10. Otwórz Postman i utwórz prośbę o wysłanie do localhost:3000/auth/register jak poniżej:

Krok 11. Następnie podpiszmy się za pomocą tego adresu URL localhost:3000/auth/sign_in . Wprowadź klucze i wartości adresu e-mail i hasła

Pod wartością dodaj JWT i token ze spacją między nimi:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Krok 11. Następnie wprowadź parametry klucza i wartość do pobrania profilu. Chcesz utworzyć, jak pokazano poniżej i wysłać:

Jak widzieliśmy, zbudowanie systemu uwierzytelniania JWT za pomocą NodeJS jest dość łatwe. Pełny kod użyty w tym samouczku można znaleźć tutaj.

Uwaga:za pomocą tego narzędzia możesz odkodować lub zweryfikować szczegóły tokena JWT


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Przesyłaj strumieniowo z kursora mongodb do odpowiedzi Express w node.js

  2. Lokalizacja bazy danych mongodb na mac

  3. 2 sposoby na uzyskanie rozmiaru dokumentu w MongoDB

  4. mongodb - utwórz dokument, jeśli nie istnieje, w przeciwnym razie przesuń do tablicy

  5. Jak scalić pole tablicy w dokumencie w agregacji Mongo