node使用JWT(json web token)記錄

本人接觸后臺開發(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使用的理解如下圖:

如果理解有誤,請大牛指出。


image.png

可我在使用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"));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前端開發(fā)者丨h(huán)ttp請求 https:www.rokub.com 前言見解有限, 如有描述不當(dāng)之處, 請幫忙指出,...
    麋鹿_720a閱讀 11,292評論 11 31
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,211評論 3 119
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,593評論 19 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,410評論 4 61
  • 這是屬于他們的1988,他們的青春 可是這樣的青春多令人羨慕啊 被太多人安利,也看過太多贊美它的辭藻,在微博豆瓣更...
    _阿圈閱讀 3,569評論 0 4

友情鏈接更多精彩內(nèi)容