session还是token
之前把session搞了个半懂,sails通过req.session.user = user来储存用户的会话,然后把session存放到redis数据库里这样就能实现验证用户登陆的,如果session过期,用户数据则会消失,访问就会失效,则需要用户再次登陆。
然后今天才发现这样只适合网站这样的短时间存储用户登陆,因为大量用户登陆会存储大量的session使数据库存放不下,所以APP这种需要长时间保存用户登陆的方法不是通过session,而是通过token验证。
JWT
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
在验证用户登陆通过后,jwt通过加密生成一长串token,发送给前端,然后前端储存后每次请求携带这个token与服务器进行校验来判断用户状态
1.服务端登陆成功后,生成一个token发送给前端
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.前端请求发送一个储存的token
3.服务器中间件验证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: '你没有权限访问'
});
}
};