本人接觸后臺開發(fā)不久,最近在看token相關(guān)的文章,看了幾天有一些收獲,不過也存在一些問題,這篇文章只是記錄一個我的學(xué)習(xí)過程。
如果文中出現(xiàn)錯誤,請大牛指正。
官網(wǎng) https://jwt.io/
node.js模塊庫及教程:https://github.com/auth0/node-jsonwebtoken
基礎(chǔ)用法:(和官網(wǎng)有細(xì)微區(qū)別)
#生成一個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);
})
其他細(xì)節(jié)用法請去官網(wǎng)查詢。
對于token使用的理解如下圖:
如果理解有誤,請大牛指出。

可我在使用jsonwebtoken這個模塊的時候,發(fā)現(xiàn)其只有生成和驗證的方法,如果要按照上面的流程圖來使用,我個人認(rèn)為還要加工一下:
我把生成token的方法二次加工了一下,代碼如下:
const createToken = (username, plat, expires, strTimer) => {
let token = jwt.sign({
User: username,
Plat: plat
}, secret, {
expiresIn: expires + " " + strTimer
});
return token;
}
其中的User和Plat都是我亂加的,這些信息可以根據(jù)自己需要替換。
這時我要生成兩個token,一個七天有效期的存放到數(shù)據(jù)庫,一個2小時有效期的發(fā)給用戶,就可以用下面的方法:
let serverToken = createToken("admin", "WEB", "7", "days");
let localToken = createToken("admin", "WEB", "2", "hours");
console.log(serverToken);
console.log(localToken);
然后我只要通過操作數(shù)據(jù)庫和響應(yīng)用戶請求即可完成保存和發(fā)送token。
用戶的本地token過期時,服務(wù)器可以先判斷數(shù)據(jù)庫中的serverToken是否過期,如果過期就讓用戶重新登錄,重新登錄后,本地token和服務(wù)器token都會被重新刷新。如果服務(wù)器token沒過期,就重新生成一個2小時有效期的localToken給用戶。
驗證token
驗證token的方法我也進(jìn)行了二次加工:
const verifyToken = (_token) => {
let verify = jwt.verify(_token, secret, (error, decoded) => {
if(error) {
return "Token Invalid";
}
return decoded;
});
return verify;
};
然后試試:
console.log(verifyToken("123123123"));
結(jié)果如下:
Token Invalid
用戶在使用時,本地token過期怎么辦?
我認(rèn)為的是,完全不用擔(dān)心。
因為就算本地token過期,服務(wù)器token還沒過期,我們只要讓用戶每次請求都發(fā)送token,那么只要在服務(wù)器token有效期之內(nèi),用戶的操作是不受影響的,最多會增加幾百毫秒的刷新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"));