jsonwebtoken生成與解析token

之前寫(xiě)了一篇介紹token的文章:簡(jiǎn)單理解Token機(jī)制token算法自己設(shè)計(jì)的佛析,使用了隨機(jī)算法痹仙,導(dǎo)致token無(wú)法進(jìn)行反向解密闷游。所以我當(dāng)初使用了redis進(jìn)行存儲(chǔ)token拜姿,前端調(diào)用API時(shí)需要攜帶token進(jìn)行身份驗(yàn)證烙样,token有效期48小時(shí)。但是我們有說(shuō)過(guò):sessionid是需要空間進(jìn)行存儲(chǔ)的砾隅,但是token在服務(wù)器是可以不需要存儲(chǔ)用戶(hù)信息的误阻。所以我們能不能做到用戶(hù)注冊(cè)登陸成功給用戶(hù)生成一個(gè)token返回給客戶(hù)端债蜜,等前端攜帶token調(diào)用API時(shí)我們直接解析token看能否解析出用戶(hù)數(shù)據(jù)來(lái)決定用戶(hù)是否有接口權(quán)限呢晴埂?事實(shí)上NodeJS提供的一個(gè)npm包:jsonwebtoken就可以實(shí)現(xiàn)token的生成與反向解密出用戶(hù)數(shù)據(jù)。接下來(lái)我們看看jsonwentoken如何進(jìn)行使用寻定。

首先先全局安裝一個(gè)express-generator儒洛,命令為:

npminstall -g express-generator

然后使用express-generator快速搭建一個(gè)express項(xiàng)目,命令為:

expressexpress_demo

然后進(jìn)入項(xiàng)目并且安裝express項(xiàng)目所需依賴(lài)狼速,命令為:

cdexpress_demo && npm install

到這里項(xiàng)目搭建成功了琅锻,我們可以看看項(xiàng)目結(jié)構(gòu):

首先在util下創(chuàng)建common.js,該文件主要放置常用公共方法向胡,這里我目前只有兩個(gè)公共方法:paramAll(用來(lái)獲取前端傳來(lái)的參數(shù))恼蓬,encryPassword(對(duì)密碼拼接字符串進(jìn)行MD5加密)。

可以看到第一行導(dǎo)入crypto依賴(lài)僵芹,MD5加密需要使用到這個(gè)包处硬,所以我們先裝下這個(gè)依賴(lài),命令為:

npminstall --save-dev crypto

然后在util下創(chuàng)建bootloader.js拇派,主要封裝幾個(gè)全局函數(shù)荷辕,用來(lái)輸出測(cè)試數(shù)據(jù)以及給前端返回?cái)?shù)據(jù)使用凿跳。

然后打開(kāi)config.js,配置jsonwebtoken生成token所需的secret疮方,secret為加密密鑰控嗜,不能泄露給其他人使用。

接下來(lái)步入正軌了骡显,我們一直說(shuō)使用jsonwebtoken生成token疆栏,那當(dāng)然我們首先安裝下jsonwebtoken巫员,命令為:

npminstall --save-dev jsonwebtoken

接下來(lái)我們來(lái)寫(xiě)個(gè)接口是線(xiàn)下token的生成月匣,我們接口實(shí)現(xiàn)在router下實(shí)現(xiàn)。首先打開(kāi)router/users.js毡鉴,在文件頂部先導(dǎo)入我們剛才編寫(xiě)的幾個(gè)文件:

接下來(lái)我們實(shí)現(xiàn)接口石挂,將用戶(hù)的基本信息結(jié)合我們?cè)O(shè)置的密鑰secret通過(guò)jsonwebtoken生成token:

通過(guò)我們剛才封裝的paramAll()進(jìn)行過(guò)去前端的傳參博助,密碼是隱私數(shù)據(jù)所以通過(guò)封裝好的encryPassword()進(jìn)行MD5加密。然后結(jié)合secret通過(guò)jsonwebtoken.sign(info, secret, options)進(jìn)行加密生成token痹愚。我們來(lái)看下接口效果:

可以看到我們成功將用戶(hù)信息轉(zhuǎn)化為token了富岳,接下來(lái)我們來(lái)看看如何反向解析出用戶(hù)數(shù)據(jù),解析token使用方法:

jsonwebtoken.verify(token,secret,callback)

我們實(shí)現(xiàn)一個(gè)接口實(shí)現(xiàn)解析用戶(hù)token獲取用戶(hù)信息:

這里需要注意的一點(diǎn):如果token解析失敗或者token已經(jīng)過(guò)期拯腮,則都會(huì)返回err窖式,只有正確解析出用戶(hù)數(shù)據(jù)才會(huì)返回data。我們可以看下效果:

可以看到我們成功把用戶(hù)數(shù)據(jù)解析出來(lái)动壤,接下來(lái)我們可以看看在真正的API接口中我們?nèi)绾稳ナ褂?b>jsonwebtoken去進(jìn)行token的解析使用萝喘。首先我們提到過(guò)了接口安全性一般要使用簽名,簽名規(guī)則還是依舊使用我一直使用的規(guī)則:

1.將接口所需參數(shù)加上當(dāng)前時(shí)間戳參數(shù)time琼懊,time取毫秒值組裝成json對(duì)象阁簸。

2.將所有參數(shù)以key=value的形式按照ASCII的順序進(jìn)行排序得到waitSign。

3.對(duì)waitSign進(jìn)行MD5加密哼丈,得到signParam.

4.將signParam轉(zhuǎn)化為純小寫(xiě)启妹,得到最終的簽名sign。

那接下來(lái)我們首先先把生成簽名的算法封裝成公共方法放到common.js中:

API接口免不了數(shù)據(jù)庫(kù)操作醉旦,我們接下來(lái)封裝下數(shù)據(jù)庫(kù)操作饶米。首先在config.js中配置數(shù)據(jù)庫(kù)配置信息:

接下來(lái)在項(xiàng)目根目錄創(chuàng)建db文件夾,在db下創(chuàng)建mysql.js對(duì)數(shù)據(jù)庫(kù)的增刪改查操作進(jìn)行封裝车胡,先封裝連接池初始化以及連接池釋放方法:

再封裝一個(gè)用戶(hù)插入更新數(shù)據(jù)檬输,一個(gè)用于查詢(xún)數(shù)據(jù):

到這里數(shù)據(jù)庫(kù)我們也封裝好了,我們開(kāi)始寫(xiě)API實(shí)現(xiàn)用戶(hù)登陸匈棘,登陸成功生成token丧慈。我們看看實(shí)現(xiàn)的代碼:

其實(shí)登陸邏輯可以分為三個(gè)步驟:

1.將參數(shù)按照解密規(guī)則加密生成簽名sign

2.簽名驗(yàn)證成功,數(shù)據(jù)庫(kù)驗(yàn)證賬號(hào)密碼是否匹配3.賬號(hào)密碼匹配生成token與用戶(hù)信息一起返回給前端

我將數(shù)據(jù)庫(kù)操作封裝到dao層下的users.js下羹饰,我們看下登陸數(shù)據(jù)庫(kù)的邏輯代碼:

到這里登陸邏輯完成了伊滋,我們看下接口的調(diào)用效果:

調(diào)用成功碳却,會(huì)生成一個(gè)token結(jié)合用戶(hù)信息一起返回給前端。我們?cè)賹?shí)現(xiàn)一個(gè)接口查詢(xún)用戶(hù)個(gè)人積分信息笑旺。前端調(diào)用API需要攜帶token進(jìn)行驗(yàn)證個(gè)人信息昼浦。

本接口一樣分成三個(gè)步驟:

1.將參數(shù)按照解密規(guī)則加密生成簽名sign

2.簽名驗(yàn)證成功,解析token驗(yàn)證解析后的用戶(hù)賬號(hào)與用戶(hù)傳參的賬號(hào)是否一致

3.驗(yàn)證成功進(jìn)行數(shù)據(jù)庫(kù)操作查詢(xún)用戶(hù)的積分?jǐn)?shù)據(jù)返回給前端

一樣我們把數(shù)據(jù)庫(kù)操作封裝在dao/users.js下筒主,我們可以看下數(shù)據(jù)庫(kù)邏輯:

我們看下接口調(diào)用效果:

可以看到我們成功解析token獲得用戶(hù)信息关噪,并查詢(xún)到用戶(hù)的積分信息。

其實(shí)在公司前后端交互基本上我們也是采用簽名sign?+?token + timestamp的驗(yàn)證方式乌妙。本篇文章也完成的重現(xiàn)了開(kāi)發(fā)接口的整個(gè)流程使兔,為了提高代碼可維護(hù)性,我們將一些公共方法全部進(jìn)行了封裝藤韵,為后續(xù)的產(chǎn)品迭代增加了更多的可能性虐沥。

本篇文章源碼以及上篇加解密算法源碼已上傳碼云,下載鏈接:

https://gitee.com/mqzuimeng/test_code.git

????????如果喜歡我的文章泽艘,歡迎關(guān)注我的個(gè)人公眾號(hào):周先生自留地欲险。

推薦閱讀

前后端分離之交互(1)

你不知道的前后端分離之交互(2)

簡(jiǎn)單理解Token機(jī)制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匹涮,隨后出現(xiàn)的幾起案子天试,更是在濱河造成了極大的恐慌,老刑警劉巖然低,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喜每,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雳攘,警方通過(guò)查閱死者的電腦和手機(jī)带兜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)来农,“玉大人鞋真,你說(shuō)我怎么就攤上這事崇堰∥钟冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵海诲,是天一觀的道長(zhǎng)繁莹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)特幔,這世上最難降的妖魔是什么咨演? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蚯斯,結(jié)果婚禮上薄风,老公的妹妹穿的比我還像新娘饵较。我一直安慰自己,他們只是感情好遭赂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布循诉。 她就那樣靜靜地躺著,像睡著了一般撇他。 火紅的嫁衣襯著肌膚如雪茄猫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天困肩,我揣著相機(jī)與錄音划纽,去河邊找鬼。 笑死锌畸,一個(gè)胖子當(dāng)著我的面吹牛勇劣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播潭枣,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芭毙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卸耘?” 一聲冷哼從身側(cè)響起退敦,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚣抗,沒(méi)想到半個(gè)月后侈百,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翰铡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年钝域,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锭魔。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡例证,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迷捧,到底是詐尸還是另有隱情织咧,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布漠秋,位于F島的核電站笙蒙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏庆锦。R本人自食惡果不足惜捅位,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艇搀,春花似錦尿扯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至淀散,卻和暖如春右莱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背档插。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工慢蜓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郭膛。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓晨抡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親则剃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耘柱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,093評(píng)論 1 32
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,146評(píng)論 0 3
  • 一、背景 Koa 是一個(gè)新的 web 框架棍现,由 Express 幕后的原班人馬打造调煎, 致力于成為 web 應(yīng)用和 ...
    bayi_lzp閱讀 10,495評(píng)論 6 26
  • 這兩天婆婆說(shuō)要去旅游去桂林,目的是想坐飛機(jī)己肮,說(shuō)一輩子沒(méi)坐過(guò)士袄。都說(shuō)沒(méi)試過(guò)的東西都去試試總沒(méi)錯(cuò)。不然回首往事谎僻,你真的只...
    奔騰君閱讀 170評(píng)論 0 0
  • 在這個(gè)顏值即正義的年代艘绍,長(zhǎng)得好看真的是天然的優(yōu)勢(shì)赤拒。縱觀娛樂(lè)圈诱鞠,顏值高的藝人不計(jì)其數(shù)挎挖,而有才華的一人確是少之又少。但...
    Healer_peng閱讀 561評(píng)論 0 1