nodejs之express的token驗(yàn)證

原文地址:https://blog.csdn.net/qq_39905409/article/details/87905335

1鸯匹、用jsonwebtoken生成token
2雾消、用express-jwt驗(yàn)證token是否過期或失效
3灾搏、用jsonwebtoken解析出token中的用戶信息,比如用戶id

注意:
使用res.json()發(fā)送響應(yīng)時(shí)立润,在此前加一個(gè)return狂窑,
即return res.json(),類似res.send()等函數(shù)也要加return桑腮,
而且是所有的地方都要加泉哈,即使是a請求的響應(yīng)沒加return,
當(dāng)b請求到來時(shí)破讨,也會(huì)報(bào)錯(cuò):cant’t set headers after they are sent丛晦。

報(bào)錯(cuò)原因: 默認(rèn)多次操作res或req
1、新建token_vertify.js文件提陶,用于封裝token生成和解析函數(shù)
// token_vertify.js
var jwt = require('jsonwebtoken');
var signkey = 'mes_qdhd_mobile_xhykjyxgs'; // 密匙

exports.setToken = function(username,userid){
    return new Promise((resolve,reject)=>{
        const token = jwt.sign({
            name:username,
            _id:userid
        },signkey,{ expiresIn:'0.01h' });
        resolve(token);
    })
}

exports.verToken = function(token){
    return new Promise((resolve,reject)=>{
        var info = jwt.verify(token.split(' ')[1],signkey);
        resolve(info);
    })
}
2烫沙、在app.js中自定義一個(gè)中間件用于驗(yàn)證token是否過期,如果沒過期隙笆,則解析出用戶信息
// app.js中部分代碼
var vertoken = require('./public/javascripts/token_vertify.js');
var expressJwt = require('express-jwt');

// 解析token獲取用戶信息
app.use(function(req, res, next) {
    var token = req.headers['authorization'];
    if(token == undefined){
        return next();
    }else{
        vertoken.verToken(token).then((data)=> {
            req.data = data;
            return next();
        }).catch((error)=>{
            return next();
        })
    }
});

//驗(yàn)證token是否過期并規(guī)定哪些路由不用驗(yàn)證
app.use(expressJwt({
    secret: 'mes_qdhd_mobile_xhykjyxgs' // 密匙
}).unless({
    path: ['/login']//除了這個(gè)地址锌蓄,其他的URL都需要驗(yàn)證
}));

app.use(express.static(path.join(__dirname, 'public')));
app.use('/login', loginRouter);
app.use('/users', usersRouter);

//當(dāng)token失效返回提示信息
app.use(function(err, req, res, next) {
    if (err.status == 401) {
        return res.status(401).send('token失效');
    }
});
3、在接口中運(yùn)用上面定義的方法
// login.js文件
var express = require('express');
var router = express.Router();
var settoken = require('../public/javascripts/token_vertify.js');

// 生成token
router.post('/', function(req, res, next) {
    var username = 'slj';
    var userid = "111";
    settoken.setToken(username,userid).then((data)=>{
        return res.json({ token: data });
    })
    return next();
});

module.exports = router;
// users.js文件
var express = require('express');
var router = express.Router();

// 驗(yàn)證token
router.post('/vertify', function(req, res, next) {
    console.log(req.data)
    if(req.data){
        return res.json({
            msg:'身份驗(yàn)證成功'
        })
    }else{
        return res.json({
            msg:'未獲取到用戶信息'
        })
    }
    next();
});

module.exports = router;

看一下結(jié)果:

請求/login生成token并返回給客戶端

在這里插入圖片描述

成功驗(yàn)證token

在這里插入圖片描述

當(dāng)token失效

在這里插入圖片描述

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撑柔,一起剝皮案震驚了整個(gè)濱河市瘸爽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乏冀,老刑警劉巖蝶糯,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辆沦,居然都是意外死亡昼捍,警方通過查閱死者的電腦和手機(jī)识虚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妒茬,“玉大人担锤,你說我怎么就攤上這事≌ё辏” “怎么了肛循?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長银择。 經(jīng)常有香客問我多糠,道長,這世上最難降的妖魔是什么浩考? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任夹孔,我火速辦了婚禮,結(jié)果婚禮上析孽,老公的妹妹穿的比我還像新娘搭伤。我一直安慰自己,他們只是感情好袜瞬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布怜俐。 她就那樣靜靜地躺著,像睡著了一般邓尤。 火紅的嫁衣襯著肌膚如雪拍鲤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天裁赠,我揣著相機(jī)與錄音殿漠,去河邊找鬼。 笑死佩捞,一個(gè)胖子當(dāng)著我的面吹牛绞幌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播一忱,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼莲蜘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帘营?” 一聲冷哼從身側(cè)響起票渠,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芬迄,沒想到半個(gè)月后问顷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年杜窄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肠骆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塞耕,死狀恐怖蚀腿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扫外,我是刑警寧澤莉钙,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站筛谚,受9級特大地震影響磁玉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刻获,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一蜀涨、第九天 我趴在偏房一處隱蔽的房頂上張望瞎嬉。 院中可真熱鬧蝎毡,春花似錦、人聲如沸氧枣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽便监。三九已至扎谎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烧董,已是汗流浹背毁靶。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逊移,地道東北人预吆。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像胳泉,于是被迫代替她去往敵國和親拐叉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容