session還是token
之前把session搞了個半懂,sails通過req.session.user = user來儲存用戶的會話缸兔,然后把session存放到redis數(shù)據(jù)庫里這樣就能實現(xiàn)驗證用戶登陸的,如果session過期胎许,用戶數(shù)據(jù)則會消失鹤竭,訪問就會失效,則需要用戶再次登陸踩窖。
然后今天才發(fā)現(xiàn)這樣只適合網(wǎng)站這樣的短時間存儲用戶登陸,因為大量用戶登陸會存儲大量的session使數(shù)據(jù)庫存放不下晨横,所以APP這種需要長時間保存用戶登陸的方法不是通過session洋腮,而是通過token驗證箫柳。
JWT
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景啥供。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息悯恍,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息伙狐,該token也可直接被用于認(rèn)證涮毫,也可被加密。
在驗證用戶登陸通過后贷屎,jwt通過加密生成一長串token罢防,發(fā)送給前端,然后前端儲存后每次請求攜帶這個token與服務(wù)器進(jìn)行校驗來判斷用戶狀態(tài)
1.服務(wù)端登陸成功后唉侄,生成一個token發(fā)送給前端
var jwt = require('jwt-simple');
var moment = require('moment')
var expires = moment().add(7, 'seconds').valueOf();
var token = jwt.encode({iss: user.id,exp: expires}, '這里填寫一個秘鑰');
return res.json({result: '登陸成功',user: user,token: token})
2.前端請求發(fā)送一個儲存的token
3.服務(wù)器中間件驗證token
module.exports = function(req, res, next) {
var token = (req.body && req.body.token) || (req.query && req.query.token) || req.headers['x-access-token'];
console.log(token)
if(token) {
var decoded = jwt.decode(token, '之前填寫一個秘鑰');
console.log('decoded:' + JSON.stringify(decoded))
//判斷token是否超時
if(decoded.exp <= Date.now()) {
console.log('token超時')
return res.json({
err: '訪問已超時'
})
}
User.findOne({
id: decoded.iss
}).exec(function(err, user) {
if(err) {
return res.json(err)
}
console.log(user)
req.user = user;
return next()
})
} else {
return res.json({
err: '你沒有權(quán)限訪問'
});
}
};