MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Xác thực ứng dụng NodeJS và MongoDB bởi JWT

Trong blog này, chúng tôi sẽ triển khai xác thực với JWT trong ứng dụng web NodeJS. Đối với điều này, chúng tôi sẽ sử dụng jsonwebtoken gói

JWT là gì?

JWT (JSON Web Token) là một định dạng mã thông báo. Nó được ký điện tử, khép kín và nhỏ gọn. Nó cung cấp một cơ chế thuận tiện để truyền dữ liệu. JWT vốn không an toàn, nhưng việc sử dụng JWT có thể đảm bảo tính xác thực của thông điệp miễn là chữ ký được xác minh và tính toàn vẹn của trọng tải có thể được đảm bảo. JWT thường được sử dụng để xác thực không trạng thái trong các trường hợp sử dụng đơn giản liên quan đến các hệ thống không phức tạp.

Đây là một ví dụ về JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsIm

Bây giờ, hãy xác thực / bảo vệ một số tuyến đường.

Điều kiện tiên quyết:

  • Kiến thức cơ bản về HTML / JavaScript
  • NodeJS nên được cài đặt trong hệ thống của bạn.
  • mô-đun express để tạo máy chủ.
  • mô-đun mongoose cho kết nối MongoDB và các truy vấn.
  • mô-đun bcrypt để băm.

bạn có thể cài đặt tất cả các gói cần thiết bằng cách sử dụng lệnh sau:

npm install express mongoose bcrypt  --save

Bước 1. Đầu tiên, tạo một cấu trúc thư mục như sau:

JWTApp

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

Bước 2. Cài đặt “ jsonwebtoken ”Gói bằng cách sử dụng lệnh sau

 npm install jsonwebtoken -- save

Bước 3. Tạo mô hình người dùng

Trong thư mục api / models, hãy tạo một tệp có tên là user userModel.js bằng cách chạy chạm api / models / userModel.js.

Trong tệp này, hãy tạo một lược đồ mongoose với các thuộc tính sau:

  • fullName
  • địa chỉ email
  • mật khẩu
  • ngày được tạo

Thêm mã sau

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

Bước 4. Tạo trình xử lý người dùng

Trong api / bộ điều khiển thư mục, tạo một tệp có tên là user userController.js bằng cách chạy touch api / controllers / userController.js

Trong tệp userController, hãy tạo ba trình xử lý khác nhau để xử lý bằng cách sử dụng mã sau

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

Lưu ý: Mật khẩu băm đã được lưu trong cơ sở dữ liệu bằng bcrypt.

Bước 6. Trong api / route thư mục, tạo một tệp có tên là user userRoute.js và thêm mã sau:

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

Bước 7. Thêm mã sau vào 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;

Bước 9. Bây giờ bạn chỉ cần chạy dự án bằng cách sử dụng lệnh sau và thử ghi nhật ký bằng cách sử dụng JWT.

npm start

Bước 10. Mở Postman và tạo yêu cầu đăng bài tới localhost:3000 / auth / register như bên dưới:

Bước 11. Sau đó, hãy đăng nhập bằng URL này localhost:3000 / auth / sign_in . Nhập các khóa và giá trị cho email và mật khẩu

Dưới giá trị, hãy thêm JWT và mã thông báo với khoảng cách giữa, như sau:

JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im9sYXR1bmRlZ2FydWJhQGdtYWlsLmNvbSIsImZ1bGxOYW1lIjoiT2xhdHVuZGUgR2FydWJhIiwiX2lkIjoiNThmMjYzNDdiMTY1YzUxODM1NDMxYTNkIiwiaWF0IjoxNDkyMjgwMTk4fQ.VcMpybz08cB5PsrMSr25En4_EwCGWZVFgciO4M-3ENE

Bước 11. Sau đó, nhập các tham số cho khóa và giá trị để tìm nạp hồ sơ. Bạn muốn tạo như hình bên dưới và gửi:

Như chúng ta đã thấy, khá dễ dàng để xây dựng một hệ thống xác thực JWT với NodeJS, Bạn có thể tìm thấy mã hoàn chỉnh được sử dụng trong hướng dẫn này tại đây.

Lưu ý:Bạn có thể giải mã hoặc xác minh chi tiết mã thông báo JWT của mình bằng công cụ này


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. ánh xạ trong tạo chỉ mục trong tìm kiếm đàn hồi thông qua sông mongodb không có hiệu lực

  2. Nhận tập lệnh được tạo trong trình điều khiển MongoDB C #

  3. Kết hợp PostgreSQL và MongoDB (dưới dạng phụ trợ Django)

  4. Làm cách nào để tránh cảnh báo transparent_hugepage / defrag từ mongodb?

  5. Duy trì bộ bản sao MongoDB trong đám mây bằng cách sử dụng Ansible