成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

淺析nodejs中怎么使用JWT?

本篇文章帶大家了解一下JWT,介紹一下JWT在node中的應(yīng)用,以及JWT的優(yōu)缺點(diǎn),希望對大家有所幫助!

淺析nodejs中怎么使用JWT?

什么是JWT

JWT也就是JSON Web Token的縮寫,也就是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境中一種認(rèn)證解決方案,在傳統(tǒng)的認(rèn)證機(jī)制中,無非是一下幾個步驟:

1. 用戶將賬號密碼發(fā)送到服務(wù)器;  2. 服務(wù)器通過驗證賬號密碼后,會在當(dāng)前session中保存一些用戶相關(guān)的信息,用戶角色或者過期時間等等;  3. 服務(wù)器給用戶一個session_id, 寫入用戶的Cookie或者客戶端自行保存在本地;  4. 用戶每次請求服務(wù),都需要帶上這個session_id,或許會通過Cookie,或者其他的方式;  5. 服務(wù)器接收到后,回去數(shù)據(jù)庫查詢當(dāng)前的session_id,校驗該用戶是否有權(quán)限;
登錄后復(fù)制

這種模式有一種優(yōu)勢在于,服務(wù)器隨時可以終止用戶的權(quán)限,可以去數(shù)據(jù)庫修改或者刪除當(dāng)前用戶的session信息。但是也有一點(diǎn)不好的,就是如果是服務(wù)器集群的話,所有的機(jī)器就需要共享這些session信息,確保每臺服務(wù)器都能夠獲取到相同的session存儲信息。雖然可以解決這些問題,但是工程量巨大。

JWT方案的優(yōu)勢呢,就是不保存這些信息,token數(shù)據(jù)保存在客戶端,每次接受請求時,只需要校驗就好。【相關(guān)教程推薦:nodejs視頻教程、編程教學(xué)】

JWT的原理

簡單說一下JWT的原理,其實就是客戶端發(fā)送請求認(rèn)證的時候,服務(wù)器在認(rèn)證用戶之后,會生成一個JSON對象,大概包括“你是誰,你是干嘛的等等,到期時間”這些信息,重要的是一定要有到期時間;大致格式為:

{     username: "賊煩字符串er",     role: "世代碼農(nóng)",     endTime: "2022年5月20日" }
登錄后復(fù)制

但是不會用這么膚淺的方式傳給你,它會通過制定的簽名算法和你提交的payload的一些信息進(jìn)行可逆的簽名算法進(jìn)行簽名后傳輸,大致的格式我用一張圖片表示:

淺析nodejs中怎么使用JWT?

由圖片可以看出,返回的信息大致分為三部分,左側(cè)為簽名之后的結(jié)果,也就是返回給客戶端的結(jié)果,右側(cè)也是就Decoded的源碼了,三部分由“點(diǎn)”隔開,分別由紅、紫、青三種顏色一一對應(yīng):

  • 第一個紅色部分是Header,Header中主要是指定了的方式,圖中的簽名算法(默認(rèn)HS256)就是帶有 SHA-256 的 HMAC 是一種對稱算法, 雙方之間僅共享一個密鑰,typ字段標(biāo)識為JWT類型;

  • 第二個紫色部分payload,就是一個JSON對象,也就是實際要傳輸?shù)臄?shù)據(jù),官方有七個字段可以使用:

    • iss (issuer):簽發(fā)人
    • exp (expiration time):過期時間
    • sub (subject):主題
    • aud (audience):受眾
    • nbf (Not Before):生效時間
    • iat (Issued At):簽發(fā)時間
    • jti (JWT ID):編號

除了這些字段,你還可以搞一些自定義的字段,由于JWT默認(rèn)是不加密的,所以在使用的時候盡量注意不要使用一些敏感數(shù)據(jù)。

  • 第三部分就是Signature簽名,這一部分,是由你自己指定且只有服務(wù)器存在的秘鑰,然后使用頭部指定的算法通過下面的簽名方法進(jìn)行簽名。

JWT的簡單使用

下面我們來感受一下具體的使用:

第一步:我們需要搭建一個node的項目;通過npm init -y初始化一個項目;之后我們需要安裝依賴,分別按狀expressjsonwebtokennodemon三個依賴:

$ npm i express jsonwebtoken nodemon
登錄后復(fù)制

之后在package.json中的scripts字段中添加nodemon app.js命令:

"scripts": {     "start": "nodemon app.js" },
登錄后復(fù)制

第二步:初始化一下node應(yīng)用,在根目錄下創(chuàng)建app.js文件;

// app.js  const express = require("express"); const app = express();  app.use(express.json());  app.listen(3000, () => {   console.log(3000 + " listening..."); // 監(jiān)聽3000端口 });
登錄后復(fù)制

第三步:引入jsonwebtoken依賴,并且創(chuàng)建接口和服務(wù)器的私鑰;

// app.js  //... const jwt = require("jsonwebtoken");  const jwtKey = "~!@#$%^&*()+,"; // ...
登錄后復(fù)制

這里面的jwtKey是我們自定義保存僅限保存在服務(wù)器中的私鑰,之后我們開始寫一個 /login 接口,用來登錄,并且創(chuàng)建本地的模擬數(shù)據(jù)庫用來校驗,并通過jwt.sign方法進(jìn)行校驗簽名:

// app.js const database = {   username: "username",   password: "password", };  app.post("/login", (req, res) => {   const { username, password } = req.body;   if (username === database.username && password === database.password) {     jwt.sign(       {         username,       },       jwtKey,       {         expiresIn: "30S",       },       (_, token) => {         res.json({           username,           message: "登陸成功",           token,         });       }     );   } });
登錄后復(fù)制

上面代碼中我們創(chuàng)建了database變量來模擬創(chuàng)建了本地的賬號密碼數(shù)據(jù)庫,用來校驗登陸;接下來建立了一個/loginpost接口,在校驗賬號密碼完全匹配之后,我們通過jsonwebtoken包導(dǎo)入的jwt對象下的人sign方法進(jìn)行簽名,這個方法有三種接口簽名:

export function sign(     payload: string | Buffer | object,     secretOrPrivateKey: Secret,     options?: SignOptions, ): string;  export function sign(     payload: string | Buffer | object,     secretOrPrivateKey: Secret,     callback: SignCallback, ): void;  export function sign(     payload: string | Buffer | object,     secretOrPrivateKey: Secret,     options: SignOptions,     callback: SignCallback, ): void;
登錄后復(fù)制

這里用到了函數(shù)重載的方式實現(xiàn)接口,我們這里將實現(xiàn)最后一個接口簽名,第一個參數(shù)可以是一個自定義的對象類型,也可以是一個Buffer類型,還可以直接是一個string類型,我們的源碼使用了object類型,自定義了一些字段,因為jwt在進(jìn)行簽名是也會對這些數(shù)據(jù)一并進(jìn)行簽名,但是值得注意的是,這里盡量不要使用敏感數(shù)據(jù),因為JWT默認(rèn)是不加密的,它的核心就是簽名,保證數(shù)據(jù)未被篡改,而檢查簽名的過程就叫做驗證

當(dāng)然你也可以對原始Token進(jìn)行加密后傳輸;

第二個參數(shù):是我們保存在服務(wù)器用來簽名的秘鑰,通常在客戶端-服務(wù)端模式中,JWS 使用 JWA 提供的 HS256 算法加上一個密鑰即可,這種方式嚴(yán)格依賴密鑰,但在分布式場景,可能多個服務(wù)都需要驗證JWT,若要在每個服務(wù)里面都保存密鑰,那么安全性將會大打折扣,要知道,密鑰一旦泄露,任何人都可以隨意偽造JWT。

第三個參數(shù):是簽名的選項SignOptions,接口的簽名:

export interface SignOptions {     algorithm?: Algorithm | undefined;     keyid?: string | undefined;     expiresIn?: string | number | undefined;     /** expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js).  Eg: 60, "2 days", "10h", "7d" */     notBefore?: string | number | undefined;     audience?: string | string[] | undefined;     subject?: string | undefined;     issuer?: string | undefined;     jwtid?: string | undefined;     mutatePayload?: boolean | undefined;     noTimestamp?: boolean | undefined;     header?: JwtHeader | undefined;     encoding?: string | undefined; }
登錄后復(fù)制

這里我們用的是expiresIn字段,指定了時效時間,使用方法參考這個文檔;

第四個參數(shù)是一個回調(diào),回調(diào)的第二個參數(shù)就是我們通過簽名生成的token,最后將這個token返回給前端,以便存儲到前端本地每次請求是帶上到服務(wù)端進(jìn)行驗證。

接下來,我們來驗證一下這個接口: 我是在vscode安裝的REST Client插件,之后在根目錄創(chuàng)建一個request.http的文件,文件內(nèi)寫上請求的信息:

POST http://localhost:3000/login content-type: application/json  {   "username": "username",   "password": "password" }
登錄后復(fù)制

之后在命令行執(zhí)行npm run start命令啟動服務(wù),之后在requset.http文件上方點(diǎn)擊Send Request按鈕,發(fā)送請求:

淺析nodejs中怎么使用JWT?

請求成功后,會看到這樣的響應(yīng)報文:

淺析nodejs中怎么使用JWT?

token字段就是我們JWT生成的token;

下面來驗證一下這個token是否有效,我們在寫一個登錄過后的接口:

app.get("/afterlogin", (req, res) => {   const { headers } = req;      const token = headers["authorization"].split(" ")[1];   // 將token放在header的authorization字段中   jwt.verify(token, jwtKey, (err, payload) => {     if (err) return res.sendStatus(403);     res.json({ message: "認(rèn)證成功", payload });   }); });
登錄后復(fù)制

這段代碼中,通過獲取請求頭中的authorization字段中的token進(jìn)行獲取之前通過JWT生成的token。 之后通過調(diào)用jwt.verify校驗方法校驗這個token是否有效,這個方法分別有三個參數(shù):

// 有四個接口簽名,可以自行查文檔  export function verify(     token: string,     // 需要檢驗的token     secretOrPublicKey: Secret | GetPublicKeyOrSecret,     // 定義在服務(wù)器的簽名秘鑰     callback?: VerifyCallback<JwtPayload | string>,     // 獲取校驗信息結(jié)果的回調(diào) ): void;
登錄后復(fù)制

接下來我們把剛才響應(yīng)的token復(fù)制到請求頭中:

### GET http://localhost:3000/afterlogin authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjUyNzg5NzA3LCJleHAiOjE2NTI3ODk3Mzd9.s9fk3YLhxTUcpUgCfIK4xQN58Hk_XEP5y9GM9A8jBbY
登錄后復(fù)制

前面的Bearer認(rèn)證, 是http協(xié)議中的標(biāo)準(zhǔn)認(rèn)證方式

同樣點(diǎn)擊Send Request當(dāng)看到下面圖片的響應(yīng),就意味著響應(yīng)成功:

淺析nodejs中怎么使用JWT?

其實

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
后入骚妇内射AV| 国产色无码精品视频免费| 一本大道东京热无码AⅤ| 久久久久精品久久九九| 国产偷国产偷亚洲高清日韩| 精品第一国产综合精品AⅤ| 国产成人 综合 亚洲欧美| XXXAV久久久久久久久久久| 真人作爱视频免费网站| 亚洲人成网站999久久久综合| 亚洲AV无码成人精品区浪潮AV| 山东中年夫妇大白天露脸自拍| 青苹果影院YY04080看| 免费中国帅气体育生GARY| 久久人人爽人人爽人人片AVY| 国自产拍偷拍精品啪啪AV| 国产日产欧产精品精品推荐| 国产精品国产三级国AV| 动漫人物插画动漫人物的视频| 白丝制服被啪到喷水很黄很暴力| AV夜夜躁狠狠躁日日躁| 91人妻人人做人碰人人爽九色 | 日本黄漫动漫在线观看视频| 欧美大屁股流白浆XXXX视频| 免费AV大片在线观看入口| 乱色熟女综合一区二区三区| 老阿姨哔哩哔哩B站肉片茄子芒果 浪货趴办公桌~H揉秘书电影无码 | CAOPORN免费视频在线| 综合精品欧美日韩国产在线| 最新国产AⅤ精品无码| 成年免费A级毛片无码| 成 人 黄 色 网 站 在线观| 国产无遮挡无码视频免费软件 | 久久99精品久久久久久久久久 | 日日碰狠狠添天天爽无码| 日韩精品一区二区三区乱码79| 日本适合十八岁以上的护肤品男| 日韩一区在线视频| 亚洲精品无码专区久久久| 亚洲国模337P人艺体艺术| 亚洲日韩精品无码AV一区二区三| JAPANESEⅩⅩⅩHD高潮| 被黑人下药做得受不了| 俄罗斯人与ZOOM人的区别| 精品久久久久久久国产潘金莲| 久久久久久精品免费免费软件 | 国产成人精品久久一区二区| 久久中文字幕无码一区二区| 免费观看电视剧全集在线播放高清| 女儿儿媳陪自己玩的心情说说| 久久精品无码一区二区三区免费| 久久久久久精品免费免费直播| 日本熟妇人妻XXXXX人电影| 亚洲情综合五月天| 在我们寝室当寄吧套子怎么样| 69国产成人精品午夜福中文| 草莓视频在线观看18| 精品久久久久久无码人妻| 日韩熟妇αv无码激情视频| 夜夜躁天天躁很很躁| 国产好爽…又高潮了毛片| 国产偷窥熟女精品视频大全| 欧美最猛性XXXXX黑人巨| 色欲AV蜜臀AV在线观看麻豆| 午夜无码福利伦利理免| 亚洲男人AV天堂午夜在| 中文字幕在线观看| 国产在线成人一区二区三区| 久久精品欧美日韩精品| 四虎永久免费地址WW41.6| 亚洲成AV人最新无码| 中文字幕久久熟女蜜桃| 抽出含了一整夜的性器液体流出| 国产精品久久无码不卡| 久久精品AⅤ无码中文字字幕重口 久久精品AⅤ无码中文字字幕蜜桃 | 成人夜色视频网站在线观看| 国产精品福利自产拍在线观看| 欧美疯狂做受XXXX高潮小说| 天堂资源中文WWW| 亚洲日韩激情无码一区 | 少妇午夜AV一区| 亚洲精品成人久久久| 国产A V无码专区亚洲AV| 精品国产AⅤ一区二区三区| 日韩少妇人妻夜夜爽| ASIAN高潮.颤抖.抽搐BL| 久久九九久精品国产88| 性猛交ⅩXXX富婆video| 137肉体摄影日本裸交| 国产FREEXXXX性麻豆| 久久嫩草影院免费看| 亚洲 日韩 丝袜 熟女 变态| 中文字幕日产无线码一区| 狠狠色欧美亚洲综合色| 欧美黑人又大又粗XXXXX吞精| 亚洲综合久久一区二区| 嗯…啊 摸 湿 奶头免费视频| 农村妇女野外交性高清片| 亚洲综合久久无码色噜噜赖水| 国产做床爱无遮挡免费视频| 欧美日韩无套内射另类| 亚洲AV色香蕉一区二区| S8在线观看成人网站| 极品尤物爆乳自慰呻吟| 日本高清视频色WWW色| 99国精产品W灬源码1688钻| 国产精品乱码久久久久久软件| 日本中文字幕一区二区高清在线| CHINESE国产HD中国熟女| 免费体验120秒视频| 中国少妇的BBWWBBWW| 久久人人爽人人爽人人片AV不| 亚洲另类激情综合偷自拍图片| 韩国电影办公室6免费完整版| 无遮挡边吃奶边做刺激视频| 97久久超碰福利国产精品…| 麻花豆传媒色午麻豆| 亚洲AV成人无码久久精品澳门| 凹凸视频免费在线| 欧美最猛性XXX| 八旬老太太BGMBGMBGM性| 人妻丰满AV中文久久不卡| 野花日本大全免费观看10中文| 久久99精品国产99久久6| 偷朋友人妻系列H文| 99久久综合狠狠综合久久| 精品久久8X国产免费观看| 亚洲高清国产AV拍精品青青草原| 草草最新发地布地址①·| 人人狠狠综合久久88成人| 又硬又粗又长又爽免费看| 韩国全部三级伦在线播放| 色婷婷AV一区二区三区4k岛国| .精品久久久麻豆国产精品| 精品国产一区二区AV片| 亚洲精品无码久久千人斩| 久久精品国产亚洲AV高清色欲| 亚洲综合一区自偷自拍| 久久久久成人片免费观看 | 免费无码AV一区二区| AV永久天堂一区二区三区香港| 人妻少妇伦在线麻豆M电影| 被邻居侵犯性HD中文字幕| 色综合99久久久无码国产精品| 国产操熟女性爱导航| 性色A码一区二区三区天美传媒 | 亚洲精品国偷自产在线99正片| 久久国产香蕉一区精品蜜桃| 孕妇泬出白浆18P| 亲孑伦一区二区三区| 疯狂做受XXXX欧美老人| 欧美最猛性XXXXX(亚洲精品)| 潮喷大喷水系列无码| 天天摸天天碰天天添| 国产拍揄自揄免费观看| 亚洲男女一区二区三区| 免费视频成人片在线观看| 波多野结衣AV一区二区三区中文| 女上男下啪啪激烈高潮无遮盖 | 狠狠人妻熟妇Av又粗又大| 一本一道AV无码中文字幕| 強暴強姦AV正片一区二区| 国产边做饭边被躁在线小说| 亚洲成人在线观看av| 免费看视频高清在线观看| 成人综合婷婷国产精品久久| 小浪货水多奶大被领导 | 用舌头去添高潮无码AV在线观看| 欧美内射潮喷一区二虎| 中文字幕久久久久久精品| 日本丰满少妇高潮XXXX| 国产日韩综合一区在线观看| 一区二区不卡AV免费观看| 久久久久久久97| MAC水蜜桃色314| 无遮挡亲胸捏胸免费视频| 久久免费99精品国产自在现线| АⅤ中文在线天堂| 群体交乱之放荡娇妻| 超鹏97国语在线| 小雪被老汉玩遍各种方式| 麻豆精品久久久久久久99蜜桃| 成人无码影片精品久久久| 亚洲成a人片8888一在线观看| 女人18片毛片60分钟630| 国产精品VA在线播放我和闺蜜| 一区二区乱子伦在线播放| 日韩久久无码免费毛片软件| 花色98堂新网名内容与理念| AV人摸人人人澡人人超碰小说| 无码人妻熟妇AV又粗又大| 国产美女裸体丝袜喷水视频| 亚洲AV无码一区二区三区网址| 狠狠97人人婷婷五月| 99国产精品久久99久久久| 无码一区在线视频| 极品人妻系列少妇系列| METART极品人体| 亚洲AV中文无码乱人伦在线R| 久久国语露脸国产精品电影|