本人接触后台开发不久,最近在看token相关的文章,看了几天有一些收获,不过也存在一些问题,这篇文章只是记录一个我的学习过程。
如果文中出现错误,请大牛指正。
官网 https://jwt.io/
node.js模块库及教程:https://github.com/auth0/node-jsonwebtoken
基础用法:(和官网有细微区别)
#生成一个token
const jwt = require('jsonwebtoken');
const secret = 'abc';
let token = jwt.sign({
name: 'ChasenKaos',
}, secret, (err, token) => {
console.log(token)
});
#验证token
let _token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiQ2hhc2VuS2FvcyIsImlhdCI6MTUzMjU5NDIzOH0.88q7NhhOieHjin5-4P9dTO8jaRyZheNLHG6GhU2Ol6Y"
jwt.verify(_token, secret, (error, decoded) => {
if(error) {
console.log(error.message);
}
console.log(decoded);
})
其他细节用法请去官网查询。
对于token使用的理解如下图:
如果理解有误,请大牛指出。
image.png
可我在使用jsonwebtoken这个模块的时候,发现其只有生成和验证的方法,如果要按照上面的流程图来使用,我个人认为还要加工一下:
我把生成token的方法二次加工了一下,代码如下:
const createToken = (username, plat, expires, strTimer) => {
let token = jwt.sign({
User: username,
Plat: plat
}, secret, {
expiresIn: expires + " " + strTimer
});
return token;
}
其中的User和Plat都是我乱加的,这些信息可以根据自己需要替换。
这时我要生成两个token,一个七天有效期的存放到数据库,一个2小时有效期的发给用户,就可以用下面的方法:
let serverToken = createToken("admin", "WEB", "7", "days");
let localToken = createToken("admin", "WEB", "2", "hours");
console.log(serverToken);
console.log(localToken);
然后我只要通过操作数据库和响应用户请求即可完成保存和发送token。
用户的本地token过期时,服务器可以先判断数据库中的serverToken是否过期,如果过期就让用户重新登录,重新登录后,本地token和服务器token都会被重新刷新。如果服务器token没过期,就重新生成一个2小时有效期的localToken给用户。
验证token
验证token的方法我也进行了二次加工:
const verifyToken = (_token) => {
let verify = jwt.verify(_token, secret, (error, decoded) => {
if(error) {
return "Token Invalid";
}
return decoded;
});
return verify;
};
然后试试:
console.log(verifyToken("123123123"));
结果如下:
Token Invalid
用户在使用时,本地token过期怎么办?
我认为的是,完全不用担心。
因为就算本地token过期,服务器token还没过期,我们只要让用户每次请求都发送token,那么只要在服务器token有效期之内,用户的操作是不受影响的,最多会增加几百毫秒的刷新token时间。
完整代码:
token.js
const jwt = require('jsonwebtoken');
const secret = 'abc';
const createToken = (username, plat, expires, strTimer) => {
let token = jwt.sign({
User: username,
Plat: plat
}, secret, {
expiresIn: expires + " " + strTimer
});
return token;
}
//let serverToken = createToken("admin", "WEB", "7", "days");
//let localToken = createToken("admin", "WEB", "2", "hours");
//console.log(serverToken);
//console.log(localToken);
const verifyToken = (_token) => {
let verify = jwt.verify(_token, secret, (error, decoded) => {
if(error) {
return "Token Invalid";
}
return decoded;
});
return verify;
};
//console.log(verifyToken("123123123"));
exports.createToken = createToken;
exports.verifyToken = verifyToken;
只需要在入口文件中require token.js即可使用方法。
入口文件
const token = require('./router/token.js');
console.log(token.createToken("admin1","WEB","7","days"));
网友评论