JWT(JSON WEB TOKEN)學習筆記

常規(guī)用戶認證需求

用戶先通過賬號密碼登錄獲取授權(quán)后,再獲取用戶詳情信息

對比傳統(tǒng)Session和JWT實現(xiàn)該需求的差異

傳統(tǒng)Session

流程:

  1. 客戶端使用賬號密碼來請求服務(wù)端
  2. 服務(wù)端對賬號密碼進行校驗
  3. 服務(wù)端創(chuàng)建一個Session姓迅,并將用戶登錄狀態(tài)端铛、用戶id钞支、有效時間等寫到session中
  4. 服務(wù)端將session保存到內(nèi)存中
  5. 服務(wù)端將session同步給其他集群節(jié)點
  6. 客戶端每次請求會帶上sessionId谆级,服務(wù)端根據(jù)sessionId找到對應(yīng)session棚壁,判斷session是否處于登錄狀態(tài)并取出用戶id
  7. 從session中獲取用戶id饺蔑,再根據(jù)用戶id到數(shù)據(jù)獲取用戶信息
  8. 返回用戶信息

總結(jié):

  1. 通常session都是保存在內(nèi)存中,隨著認證用戶量的增長服務(wù)端的開銷會明顯增大令哟。
  2. 在分布式架構(gòu)中恼琼,用戶在節(jié)點_1登錄后需要將session信息同步給其他節(jié)點妨蛹,或者保證同一個用戶總是路由到同一個節(jié)點上,否則用戶登錄狀態(tài)會失效

JWT(JSON WEB TOKEN)

流程:

  1. 客戶端使用賬號密碼來請求服務(wù)端
  2. 服務(wù)端對賬號密碼進行校驗
  3. 服務(wù)端生成jwt信息晴竞,并將用戶id寫到j(luò)wt的payload中
  4. 服務(wù)端將jwt信息返回給客戶端
  5. 客戶端發(fā)送獲取用戶信息請求并在header中帶上jwt信息
  6. 服務(wù)端驗證jwt的有效性并從中取出用戶id蛙卤,再根據(jù)用戶id到數(shù)據(jù)從查詢用戶信息并返回給客戶端

總結(jié):

  1. 使用JWT,服務(wù)端不用在內(nèi)存中保存任何信息噩死,在分布式架構(gòu)中也不存在同步session的過程

JWT詳解

組成

JWT由三個部分組成分別是header颤难、payload、signature用.連接已维,如:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.d1bf66192c1bff9038bcd212ba05dfde55c40d4e2254dd99c9c7653dd27c39ba

header:

{
    "typ": "JWT",
    "alg": "HS256"
}

typ: 類型行嗤,alg: 加密算法

將上面的json內(nèi)容Base64之后就形成了JWT的第一部分eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

payload:

{
    "id": 1,
    "username": "admin"
}

這部分為用戶自定義內(nèi)容(不要存放敏感信息)

將上面的json內(nèi)容Base64之后就形成了JWT的第二部分eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9

signature:

第三部分為第一部分和第二部分的簽名

let headerBase64 = new Buffer(JSON.stringify(header)).toString('base64');
let payloadBase64 = new Buffer(JSON.stringify(payload)).toString('base64');
let sha256 = crypto.createHmac('sha256', 'your salt');
sha256.update(headerBase64 + '.' + payloadBase64);
let sign = sha256.digest('hex');
let finalJwtString = headerBase64 + '.' + payloadBase64 + '.' + sign;

最終形成:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.d1bf66192c1bff9038bcd212ba05dfde55c40d4e2254dd99c9c7653dd27c39ba

栗子

授權(quán)請求

curl --request POST http://www.video4.cn:3030/session -H "Content-Type:application/json" -d '{"username":"admin","password":"123"}'

返回:

{
    "code": 0,
    "msg": "ok",
    "data": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.d1bf66192c1bff9038bcd212ba05dfde55c40d4e2254dd99c9c7653dd27c39ba"
}

獲取具體信息

curl --request GET http://www.video4.cn:3030/api/projects/2 -H "Authorization:Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiJ9.d1bf66192c1bff9038bcd212ba05dfde55c40d4e2254dd99c9c7653dd27c39ba"

返回:

{
    "code": 0,
    "msg": "ok",
    "user": {
        "id": 1,
        "username": "admin"
    },
    "data": {
        "id": 2,
        "name": "project two",
        "price": 99.99
    }
}

當您看到本文章時測試服務(wù)可能已失效,可以自行搭建測試服務(wù)垛耳。

測試Demo源碼

地址:

https://github.com/hellsam/JWT_Demo

說明:

該Demo是基于koa框架模擬實現(xiàn)了JWT的基礎(chǔ)功能栅屏,如需在項目中使用建議使用現(xiàn)成的第三方庫飘千,如:jsonwebtoken

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市栈雳,隨后出現(xiàn)的幾起案子护奈,更是在濱河造成了極大的恐慌,老刑警劉巖哥纫,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霉旗,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛀骇,警方通過查閱死者的電腦和手機厌秒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來松靡,“玉大人简僧,你說我怎么就攤上這事〉衿郏” “怎么了岛马?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屠列。 經(jīng)常有香客問我啦逆,道長,這世上最難降的妖魔是什么笛洛? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任夏志,我火速辦了婚禮,結(jié)果婚禮上苛让,老公的妹妹穿的比我還像新娘沟蔑。我一直安慰自己,他們只是感情好狱杰,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布瘦材。 她就那樣靜靜地躺著,像睡著了一般仿畸。 火紅的嫁衣襯著肌膚如雪食棕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天错沽,我揣著相機與錄音簿晓,去河邊找鬼。 笑死千埃,一個胖子當著我的面吹牛憔儿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播放可,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谒臼,長吁一口氣:“原來是場噩夢啊……” “哼唱逢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屋休,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坞古,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后劫樟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痪枫,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年叠艳,在試婚紗的時候發(fā)現(xiàn)自己被綠了奶陈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡附较,死狀恐怖吃粒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拒课,我是刑警寧澤徐勃,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站早像,受9級特大地震影響僻肖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卢鹦,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一臀脏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冀自,春花似錦揉稚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荐糜,卻和暖如春巷怜,著一層夾襖步出監(jiān)牢的瞬間葛超,已是汗流浹背暴氏。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绣张,地道東北人答渔。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像侥涵,于是被迫代替她去往敵國和親沼撕。 傳聞我的和親對象是個殘疾皇子宋雏,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)务豺,斷路器磨总,智...
    卡卡羅2017閱讀 134,697評論 18 139
  • 什么是JWT Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的...
    Dearmadman閱讀 1,061,034評論 214 1,021
  • 1. 微服務(wù)架構(gòu)介紹 1.1 什么是微服務(wù)架構(gòu)? 形像一點來說笼沥,微服務(wù)架構(gòu)就像搭積木蚪燕,每個微服務(wù)都是一個零件,并使...
    靜修佛緣閱讀 6,649評論 0 39
  • 轉(zhuǎn)載本文需注明出處:微信公眾號EAWorld奔浅,違者必究馆纳。 本文目錄: 一、單體應(yīng)用 VS 微服務(wù) 二汹桦、微服務(wù)常見安...
    72a1f772fe47閱讀 8,558評論 3 25
  • 愛舞骆,不是天長與地久的約定钥弯。 愛,不是新月與飛鳥的誓言督禽。 愛寿羞,不是黑夜與黎明的交織。 當一切歸于暗淡朦朧時 當一切都...
    春風風人閱讀 192評論 3 0