登录验证 logintoken方案
采用egg.js框架下的node.js实现
整体思路
登录
- 用户登录时,通过密码加密方案(请看另一篇内容)验证密码是否正确。
- 密码正确,随机生成login_token字符串。
- 以 专用名+login_token 命名redis的key。将需要的用户信息设置到value中,并添加过期时间
登录接口:
async login(username, password){
/**
/*先通过密码验证
**/
let strs = "jalsdjflasjdfladsjflajsdlfjalfjalsdfjjfl";
let length = 32;
let token = "";
//从strs取随机32个字符
for (let i = 0; i < length; i++) {
token += strs.charAt(Math.floor(Math.random() * strs.length));
}
let user = {
uid: key[0].dataValues.uid
};
let userinfo = JSON.stringify(user);
await this.app.redis.set("HIKI_LOGIN_TOKEN:" + token, userinfo);
await this.app.redis.expire("HIKI_LOGIN_TOKEN:" + token, 43200); //半天
result.logintoken = token;
return result;
}
登录拦截
在egg.js中有中间件。可以使用中间件进行登录验证,所以:
- 在中间件中获取get参数login_token
- 从redis中查询该login_token的字段
- 如果存在,则获取value值,以便使用
中间件:
module.exports = () => {
/**
* 登录验证拦截
*
* @author Hiki
*/
return async function(ctx, next) {
let requestQuery = ctx.query;
let token = requestQuery.login_token;
if( ctx.url == "/login" ){
//如果是登录请求则通过
await next();
}else{
if ( token == undefined ) {
//未添加login_token报错
ctx.body = Output.miss_params();
} else {
let user = JSON.parse(await ctx.app.redis.get("HIKI_LOGIN_TOKEN:" + token));
if( user == undefined ){
//login_token验证失败
ctx.body = Output.token_error();
}else{
ctx.uid = user.uid;
await next();
}
}
}
}
}
github: https://github.com/Hikiy
作者:Hiki
创建日期:2019.06.26
更新日期:2019.06.26
(转载本站文章请注明作者和出处 Hiki)