sql >> Database >  >> NoSQL >> MongoDB

NodeJS en MongoDB applicatie-authenticatie door JWT

In deze blog gaan we authenticatie met JWT implementeren in een NodeJS-webapplicatie. Hiervoor gebruiken we jsonwebtoken pakket

Wat is JWT?

JWT (JSON Web Token) is een token-indeling. Het is digitaal ondertekend, op zichzelf staand en compact. Het biedt een handig mechanisme voor het overdragen van gegevens. JWT is niet inherent veilig, maar het gebruik van JWT kan de authenticiteit van het bericht garanderen zolang de handtekening wordt geverifieerd en de integriteit van de payload kan worden gegarandeerd. JWT wordt vaak gebruikt voor stateless authenticatie in eenvoudige gebruikssituaties waarbij niet-complexe systemen betrokken zijn.

Hier is een voorbeeld van JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Laten we nu enkele routes verifiëren/beschermen.

Vereisten:

  • Basiskennis van HTML/JavaScript
  • NodeJS zou op uw systeem moeten zijn geïnstalleerd.
  • express-module voor het maken van de server.
  • mongoose-module voor MongoDB-verbinding en query's.
  • bcrypt-module voor hashing.

je kunt alle vereiste pakketten installeren door het volgende commando te gebruiken:

npm install express mongoose bcrypt  --save

Stap 1. Maak eerst een directorystructuur zoals hieronder:

JWTApp

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

Stap 2. Installeer "jsonwebtoken ” pakket door het volgende commando te gebruiken

 npm install jsonwebtoken -- save

Stap 3. Maak het gebruikersmodel

Maak in de map api/modellen een bestand met de naam user userModel.js door touch api/models/userModel.js uit te voeren.

Maak in dit bestand een mangoestschema met de volgende eigenschappen:

  • volledigeNaam
  • e-mailadres
  • wachtwoord
  • de aanmaakdatum

Voeg de volgende code toe

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

Stap 4. Maak de gebruikershandlers

In de api/controllers map, maak een bestand met de naam user userController.js door touch api/controllers/userController.js

uit te voeren

Maak in het userController-bestand drie verschillende handlers om te verwerken met behulp van de volgende code

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

Opmerking: Er is een hash-wachtwoord opgeslagen in de database met behulp van bcrypt.

Stap 6. In de api/route map, maak een bestand met de naam user userRoute.js en voeg de volgende code toe:

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

Stap 7. Voeg de volgende code toe aan 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;

Stap 9. Nu hoeft u alleen maar het project uit te voeren met behulp van de volgende opdracht en te proberen in te loggen met behulp van de JWT.

npm start

Stap 10. Open Postman en maak een postverzoek aan localhost:3000/auth/register zoals hieronder:

Stap 11. Laten we hierna ondertekenen met deze URL localhost:3000/auth/sign_in . Voer de sleutels en waarden in voor e-mail en wachtwoord

Voeg onder de waarde JWT en het token toe met een spatie ertussen, zoals:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Stap 11. Voer vervolgens de parameters in voor de sleutel en waarde voor het ophalen van het profiel. U wilt maken zoals hieronder weergegeven en verzenden:

Zoals we hebben gezien, is het vrij eenvoudig om een ​​JWT-authenticatiesysteem te bouwen met NodeJS. Je kunt de volledige code die in deze tutorial wordt gebruikt hier vinden.

Opmerking:u kunt uw JWT-tokengegevens decoderen of verifiëren met deze tool


  1. Voeg een nieuw veld toe aan elk document in een MongoDB-verzameling

  2. Volledige tekst zoekopties voor MongoDB setup

  3. Foutmelding:MongoError:slechte auth Verificatie mislukt via URI-tekenreeks

  4. Vind de grootste documentgrootte in MongoDB