MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Otentikasi aplikasi NodeJS dan MongoDB oleh JWT

Di blog ini, kami akan menerapkan otentikasi dengan JWT di aplikasi web NodeJS. Untuk ini, kami akan menggunakan jsonwebtoken paket

Apa itu JWT?

JWT (JSON Web Token) adalah format token. Ini ditandatangani secara digital, mandiri, dan kompak. Ini menyediakan mekanisme yang nyaman untuk mentransfer data. JWT tidak aman secara inheren, tetapi penggunaan JWT dapat memastikan keaslian pesan selama tanda tangan diverifikasi dan integritas muatan dapat dijamin. JWT sering digunakan untuk otentikasi stateless dalam kasus penggunaan sederhana yang melibatkan sistem non-kompleks.

Berikut contoh JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Sekarang, mari kita mengautentikasi/melindungi beberapa rute.

Prasyarat:

  • Pengetahuan dasar tentang HTML/JavaScript
  • NodeJS harus diinstal di sistem Anda.
  • modul express untuk membuat server.
  • modul luwak untuk koneksi dan kueri MongoDB.
  • modul bcrypt untuk hashing.

Anda dapat menginstal semua paket yang diperlukan dengan menggunakan perintah berikut:

npm install express mongoose bcrypt  --save

Langkah 1. Pertama, buat struktur direktori seperti di bawah ini :

JWTApp

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

Langkah 2. Instal “jsonwebtoken ” paket dengan menggunakan perintah berikut

 npm install jsonwebtoken -- save

Langkah 3. Buat model pengguna

Di folder api/models, buat file bernama user userModel.js dengan menjalankan touch api/models/userModel.js.

Dalam file ini, buat skema luwak dengan properti berikut:

  • Nama Lengkap
  • alamat email
  • sandi
  • tanggal pembuatan

Tambahkan kode berikut

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

Langkah 4. Buat penangan pengguna

Di api/controllers folder, buat file bernama user userController.js dengan menjalankan touch api/controllers/userController.js

Dalam file userController, buat tiga penangan berbeda untuk ditangani dengan menggunakan kode berikut

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

Catatan: Kata sandi hash disimpan dalam database menggunakan bcrypt.

Langkah 6. Di api/rute folder, buat file bernama user userRoute.js dan tambahkan kode berikut:

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

Langkah 7. Tambahkan kode berikut di 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;

Langkah 9. Sekarang Anda hanya perlu menjalankan proyek dengan menggunakan perintah berikut dan mencoba masuk dengan menggunakan JWT.

npm start

Langkah 10. Buka Postman dan buat permintaan posting ke localhost:3000/auth/register seperti di bawah ini:

Langkah 11. Setelah ini, mari masuk dengan URL ini localhost:3000/auth/sign_in . Masukkan kunci dan nilai untuk email dan kata sandi

Di bawah nilai, tambahkan JWT dan token dengan spasi di antaranya, seperti:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Langkah 11. Kemudian, masukkan parameter untuk kunci dan nilai untuk mengambil profil. Anda ingin membuat seperti yang ditunjukkan di bawah ini dan kirim:

Seperti yang telah kita lihat, cukup mudah untuk membangun sistem otentikasi JWT dengan NodeJS, Anda dapat menemukan kode lengkap yang digunakan dalam tutorial ini di sini.

Catatan :Anda dapat memecahkan kode atau memverifikasi detail token JWT Anda dengan alat ini


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Memetakan dokumen dengan skema yang ditentukan sebagian

  2. Menginstal Klien/Driver PHP 7 MongoDB?

  3. MongoDB $atau kueri

  4. Kapan ke Redis? Kapan ke MongoDB?

  5. Gunakan lebih dari satu skema per koleksi di mongodb