20 October 2019

NodeJS ExpressJS: signedCookies [EX-17]

(Giúp server phát hiện sự thay đổi của cookie phía client)
/app.js
app.js
const express = require('express')
const app = express()
const port = 3000
const cookieParser = require('cookie-parser');

const userRoute = require('./routes').user;
const authRoute = require('./routes').auth;
const middlware = require('./middlwares/auth.middlware');

app.set('view engine', 'pug')
app.set('views', './views');

// https://expressjs.com/en/4x/api.html#req.body
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded

app.use(cookieParser('abcdefgh123456789')); // random string
app.use(express.static('public'));

// GET method route
app.get('/', middlware.authorize, function (req, res) {
    res.render('index', {
        title: 'Hey',
        message: "ExpressJS"
    })
})

app.use('/users', middlware.authorize, userRoute);
app.use('/auth', authRoute);

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

/controller/auth.controller.js
auth.controller.js
const db = require('../db/index').lowDB;
const md5 = require('md5');

module.exports.login = function (req, res, next) {
    res.render('auth/login');
}

module.exports.postLogin = function (req, res, next) {
    const email = req.body.email;
    const password = req.body.password;

    const user = db.get('users').find({
        email: email
    }).value();

    if (!user) {
        res.render('auth/login', {
            errors: ['User does not exits'],
            values: res.body
        });
    }
    console.log(md5(password));
    if (md5(password) != user.password) {
        res.render('auth/login', {
            errors: ['Wrong password'],
            values: res.body
        });
    }
    res.cookie('userId', user.id, {
        signed: true
    });
    res.redirect('/users');
}

module.exports.postLogout = function (req, res, next) {
    res.clearCookie("userId");
    res.redirect('/');
}

/middlwares/auth.middlware.js
auth.middlware.js
const db = require('../db/index').lowDB;

module.exports.authorize = function(req, res, next) {
    console.log(req.signedCookies); // const cookieParser = require('cookie-parser'); vs app.use(cookieParser());
    if (!req.signedCookies.userId) {
        res.redirect('auth/login')
        return;
    }
    const user = db.get('users').find({
        id: req.signedCookies.userId
    }).value();
    if (!user) {
        res.redirect('auth/login');
        return;
    }
    res.locals.user = user; // Lưu object ở local nó chỉ tồn tại trong phiên làm việc => show tên người đăng nhập
    next();
}
Key name
2018
html
    head
        link(rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css")
        link(rel="stylesheet" href="/css/custom.css")
    body
        div(class="jumbotron text-center m-0 p-0")
            img(src="../../images/banner.jpg" class="w-100")
        nav(class="navbar navbar-expand-sm bg-dark navbar-dark")
            a(class="navbar-brand" href="/") Node JS + Express JS
            div(class="collapse navbar-collapse" id="collapsibleNavbar")
                ul(class="navbar-nav")
                    li(class="nav-item")
                        a(class="nav-link" href='/users') User Management
                    li(class="nav-item")
                        a(class="nav-link" href="/auth/login") Login
                    li(class="nav-item")
                        a(class="nav-link" href="/auth/logout") Logout
            span(class="text-white")= user && user.name
        div(class="container" style="margin-top:30px; min-height: 500px")
            div(class="row")
                div(class="col-sm-12")
                    block content
        div(class="jumbotron text-center p-3")
            h6 Copyright © 2019 Author DaiDH

TEST

Thay đổi id cookie của user đăng nhập hiện tại 62c56a thành id của user khác c908e2
Tiếp theo người dùng vào màn hình User Management phải qua auth.middlware.js res gửi lên sẽ là req.signedCookies.userId = false
Đưa người dùng quay lại màn login.

0 nhận xét:

Post a Comment

 

BACK TO TOP

Xuống cuối trang