Các kiến thức sử dụng:
- Cookies, signedCookies,
- JWT
1. Sử dụng JWT - jsonwebtoken
- jwt: https://jwt.io/
- npm: https://www.npmjs.com/package/jsonwebtoken
1 |
npm install jsonwebtoken |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var jwt = require('jsonwebtoken'); var data = {_id : 'duycode'}; var token = jwt.sign(data,'kjKJK#XC&*ZCDS#', { expiresIn: 30 }); var tokenString = token; var decode = jwt.verify(tokenString,'kjKJK#XC&*ZCDS#'); console.log(token) console.log(decode) //eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiJkdXljb2RlIiwiaWF0IjoxNjExNzI5NjE3fQ.GSiTLZIqgUDyj-JdGZjo1lR72WBdajbNj96BxZAA3ms //{ _id: 'duycode', iat: 1611730075, exp: 1611730105 } |
2. Sử dụng cookie-parser
npm install cookie-parser
-- Khi login, lưu lại biến cookie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//--[POST]-- /login loginStore(req, res, next) { let gmail = req.body.gmail; let password = req.body.password; User.findOne({ gmail: gmail, password: password, }) .then((data)=>{ if(data){ let token = jwt.sign({_id: data._id},'mktoken'); res.cookie('userID',token); return res.redirect('/'); }else{ return res.redirect('/login'); } }) .catch(err=>{ return res.redirect('/login'); }) } |
-- Dùng middleware để kiểm tra mỗi lần request, nếu có cookie rồi thì cho qua, nếu không có phải đăng nhập
1 2 3 |
const authMiddleware = require('../app/middlewares/AuthMiddleware'); app.use('/admin',authMiddleware.requireAuth, adminRouter); app.use('/manager',authMiddleware.requireAuth, managerRouter) |
--Middleware viết như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
const User = require('../models/User'); const jwt = require('jsonwebtoken'); module.exports.requireAuth = function (req, res, next) { if (!req.cookies.userID) { res.redirect('/login'); } let userID; try { let token = req.cookies.userID; userID = jwt.verify(token, 'mktoken'); } catch (error) { res.redirect("/login") } if (userID) { User.findById(userID) .then(() => next()) .catch(err => { return res.redirect('/login'); }) } } |
II. Nhớ 2
1. Sử dụng thư viện
1.1. JWT:
-- Cài đặt: https://www.npmjs.com/package/jsonwebtoken
** Sử dụng:
-- Đóng gói dữ liệu: { _id: user._id }
1 2 3 4 5 |
let token = jwt.sign( { _id: user._id }, process.env.SECRET_JWT, { expiresIn: 60 * 60 } ); |
-- Giải nén dữ liệu:
1 2 |
let data = jwt.verify(token, process.env.SECRET_JWT) //data -> { _id: user._id } |
1.2. cookie-parser
-- Cài đặt: https://www.npmjs.com/package/cookie-parser
-- Tại ./src/server.js
1 2 |
const cookieParser = require('cookie-parser'); app.use(cookieParser(process.env.SECRET_SIGNEDCOOKIES)); |
-- Sử dụng:
1 2 3 4 5 6 7 8 |
// Set cookie cho response, -> key: 'userID'; value: token res.cookie('userID', token, { signed: true, }); //Get cookie let token = req.signedCookies.userID; //Delete cookie res.clearCookie('userID'); |
1.3. Khai báo thêm biến của .env hoặc trên Heroku
1 2 |
SECRET_JWT=@%Abc@*678 SECRET_SIGNEDCOOKIES=@$123%@#XYZ |
2. Register
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
registerStore(req, res, next) { Object.assign(req.body, { createdAt: Date.now(), updatedAt: Date.now(), removedAt: 0, Role: "Manager", }) const user = new User(req.body); const phongkham = new PhongKham(req.body); Promise.all([user.save(), phongkham.save()]) .then(([user, phongkham]) => { Promise.all([ User.updateOne({ '_id': user._id }, { 'PhongKhamID': phongkham._id }), PhongKham.updateOne({ '_id': phongkham._id }, { 'QuanLyID': user._id }) ]) .then(() => { //tạo token trong 1 giờ let token = jwt.sign( { _id: user._id }, process.env.SECRET_JWT, { expiresIn: 60 * 60 } ); res.cookie('userID', token, { signed: true, }); return res.json(true); }) .catch(() => { return res.json(false); }) }) .catch(err => { return res.json(false); }); } |
3. Login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
loginStore(req, res, next) { User.findOne({ Gmail: req.body.Gmail, Password: req.body.Password }) .then((user) => { if (user) { //tạo token trong 1 giờ let token = jwt.sign( { _id: user._id }, process.env.SECRET_JWT, { expiresIn: 60 * 60 } ); res.cookie('userID', token, { signed: true, }); return res.json(true); } else { return res.json(false); } }) .catch(err => { return res.json(false); }) } |
4. Logout
1 2 3 4 |
logout(req, res, next) { res.clearCookie('userID'); res.redirect('/') } |