express學習-----使用session、cookie判斷使用者登入狀態
阿新 • • 發佈:2018-12-30
一. 使用cookie-parser、express-session來處理cookie和session。
// 引入
const cookieParser = require('cookie-parser');
const session = require('express-session');
// 使用
app.use(cookieParser('swq'));// 'swq'是自定義字串,用來對cookie進行簽名,提高安全性。
app.use(session({
secret: 'swq',
resave: false,
saveUninitialized: true
}))
二. 登陸成功後,將使用者ID生成cookie。
home.login = (req, res, next) => {
let data = req.body;
if(data.username == '') {
return res.send({resultCode: 400, resultMsg: '使用者名稱為空'});
} else if(data.password == '') {
return res.send({resultCode: 400, resultMsg: '密碼為空'});
} else {
User.findOne({name: data.name}).then(user => {
if(!user) {
return res.send({resultCode: 400, resultMsg: '使用者不存在'});
}
if(data.password != user.password) {
return res.send({resultCode: 400, resultMsg: '密碼錯誤'});
}
// 生成cookie
auth.gen_session(user, res);
return res.send({resultCode: 200, resultMsg: '登入成功'});
})
}
}
// 生成cookie
gen_session: (user, res) => {
let auth_user = `${user._id}`;
res.cookie('suweiqing', auth_user, {
path: '/',
signed: true,//對cookie密碼進行加密的話, 需要使用到cookieParser
httpOnly: true,
maxAge: 30 * 24 * 60 * 60 * 1000
});
},
三. 編寫中介軟體,判斷使用者是否登入(判斷session中是否有使用者資訊)。
//通過cookie去生成session的方法
app.use(auth.authUser);
authUser: (req, res, next) => {
//中介軟體, 所有的請求都要經過它, 我們在這來判斷使用者的登入情況
if(req.session.user) {
next();//使用者已經登入情況下, 直接下一步
}
else {
//需要通過cookie去生成session
//1.獲取cookie
let auth_token = req.signedCookies['suweiqing'];//cookie-parser直接幫我解密了
if (!auth_token) {
next();//使用者沒有cookie的情況
}
else {
//2.通過cookie生成session
let user_id = auth_token;
//資料庫去找這個使用者ID
User.findOne({_id: user_id}, (err, user) => {
if (err) {
return res.end(err);
}
else {
if (!user) {
next();
}
else {
//3.結束
req.session.user = user;
next();
}
}
})
}
}
}
四. 設定已登入使用者和未登入使用者的許可權。
(1)已登入使用者不能訪問未登入介面
//判斷使用者未登入的中介軟體
userRequired: (req, res, next) => {
if(!req.session || !req.session.user || !req.session.user._id) {
return res.redirect('/login');
}
next();
}
(2)未登入使用者不能訪問已登入介面
//判斷使用者已登入的中介軟體
userNotRequired: (req, res, next) => {
if(req.session.user != undefined) {
return res.redirect('back');
}
next();
}
(3) 使用許可權中介軟體
router.get('/', auth.userRequired,home.index);
router.get('/login', auth.userNotRequired, home.loginPage)