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