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

站長資訊網
最全最豐富的資訊網站

什么是JWT?JWT怎么在nodejs中使用?

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

什么是JWT?JWT怎么在nodejs中使用?

什么是JWT

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

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

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

JWT方案的優(yōu)勢呢,就是不保存這些信息,token數(shù)據(jù)保存在客戶端,每次接受請求時,只需要校驗就好。

JWT的原理

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

{     username: "賊煩字符串er",     role: "世代碼農",     endTime: "2022年5月20日" }

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

什么是JWT?JWT怎么在nodejs中使用?

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

  • 第一個紅色部分是Header,Header中主要是指定了的方式,圖中的簽名算法(默認HS256)就是帶有 SHA-256 的 HMAC 是一種對稱算法, 雙方之間僅共享一個密鑰,typ字段標識為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默認是不加密的,所以在使用的時候盡量注意不要使用一些敏感數(shù)據(jù)。

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

JWT的簡單使用

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

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

$ npm i express jsonwebtoken nodemon

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

"scripts": {     "start": "nodemon app.js" },

第二步:初始化一下node應用,在根目錄下創(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端口 });

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

// app.js  //... const jwt = require("jsonwebtoken");  const jwtKey = "~!@#$%^&*()+,"; // ...

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

// 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,         });       }     );   } });

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

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;

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

當然你也可以對原始Token進行加密后傳輸;

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

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

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

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

POST http://localhost:3000/login content-type: application/json  {   "username": "username",   "password": "password" }

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

什么是JWT?JWT怎么在nodejs中使用?

請求成功后,會看到這樣的響應報文:

什么是JWT?JWT怎么在nodejs中使用?

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: "認證成功", payload });   }); });

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

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

接下來我們把剛才響應的token復制到請求頭中:

### GET http://localhost:3000/afterlogin authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InVzZXJuYW1lIiwiaWF0IjoxNjUyNzg5NzA3LCJleHAiOjE2NTI3ODk3Mzd9.s9fk3YLhxTUcpUgCfIK4xQN58Hk_XEP5y9GM9A8jBbY

前面的Bearer認證, 是http協(xié)議中的標準認證方式

同樣點擊Send Request當看到下面圖片的響應,就意味著響應成功:

什么是JWT?JWT怎么在nodejs中使用?

其實

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品国产精品亚洲| 鲁丝一区二区三区免费| 久久久97精品国产一区蜜桃 | 婷婷久久香蕉五月综合加勒比| 午夜成人理论福利片| 亚洲精品蜜桃久久久久久| 一个吃我奶头两个舔我下面| 99精品国产一区二区电影 | 人妻系列AV无码专区| 少妇被又大又粗又爽毛片| 亚洲AV乱码一区二区三区按摩| 亚洲香蕉成人AV网站在线观看 | 亚洲成A∧人片在线播放黑人| 一边做饭一边暴躁怎么办| 啊灬啊灬啊灬快灬少妇软件| 国产激情无码一区二区三区| 精品国产一区二区AV片| 欧美成人少妇人妻精品视频| 撕掉她的衣服吮的双乳游戏| 亚洲精品二区国产综合野狼| 99国产欧美久久久精品| 国产高清在线观看AV片麻豆| 久久精品国产亚洲AV麻豆蜜芽| 欧美一区二区放荡人妇| 凸凹人妻人人澡人人添医| 亚洲熟女乱色综合一区| YY111111少妇影院免费| 国产免费看MV大片的软件| 久人人爽人人爽人人片AV| 日韩欧美人妻一区二区三区| 亚洲AV无码成人精品区明星换面| 中文字幕一线产区和二线区的区别| 成人影院YY111111在线| 精品国产乱码久久久久APP下载 | 久久综合亚洲鲁鲁五月天| 日本丰满人妻HD浓毛| 亚洲国产成人一区二区精品区| AV狠狠色超碰丁香婷婷综合久久| 国产蜜臀AV无码一区二区三区| 美女露 0裸体无挡视频| 天天摸天天做天天爽天天弄| 一炕四女被窝交换| 国产777涩在线 | 美洲| 久久综合伊人77777| 挺进大幂幂的滋润花苞御女天下| 又粗又大又硬毛片免费看| 国产AV旡码专区亚洲AV苍井空| 久久久久无码国产精品不卡| 熟交XXXXⅩ欧美老妇妇牲| 曰批免费视频免费无码软件| 国产精品成人一区二区三区| 免费无码AV片在线观看播放| 无码中文人妻在线一区二区三区| 717影院理论午夜伦八戒| 国产在线观看精品一区二区三区 | 成熟丰满熟妇强av无码区| 久久精品饰品有限公司网站| 熟睡被义子侵犯中文字幕| 中文字幕AV高清片| 国内精品久久久久久久COENT| 欧美人与物VIDEOS另类XX| 亚洲成AV人无码综合在线观看| 波多野结衣AV电影在线观看| 久久精品欧美日韩精品| 推拿完整版中文字幕| 99精品国产一区二区三区2| 和老师做H无码动漫| 色欲AV蜜桃一区二区三| 找老女人泻火对白自拍| 国内精品久久久久影院一蜜桃| 日本人妻JAPANESEXXX| 在线播放国产精品三级网| 国产在线乱子伦一区二区| 日本亚洲色大成网站WWW久久| 真人做受试看120分钟小视频| 国产一区二区三区无码免费| 日韩人妻中文无码一区二区三区| 在线看片无码永久免费视频| 国产又爽又黄又爽又刺激| 色噜噜亚洲男人的天堂| AV无码国产在线看免费APP| 久久国产精品亚洲艾草网| 小烂货夹得好紧太爽了H苏妖精| 把腿张开老子臊烂你的黄漫| 麻豆成人精品国产免费| 亚洲国产AV一区二区三区丶| 国产精品成熟老妇女| 日产精品卡1卡2卡三卡区别| 97精品国产一区二区三区| 久久精品亚洲男人的天堂| 亚洲AVTV永久综合在线| 疯狂做爰XXXⅩ高潮69短| 欧美性猛交XXXX免费看蜜桃| 永久免费看啪啪网址入口| 饥渴少妇AV无码影片| 小东西才几天没做喷的到处都是| 富婆推油偷高潮叫嗷嗷叫| 人妻体体内射精一区二区| 坐公交忘穿内裤被挺进老| 久久久久无码国产精品一区| 亚洲精品9999久久久久无码| 国产亚洲AV电影院之毛片| 天堂AV男人在线播放| 纯肉无遮挡H肉动漫在线观看国产 纯肉无遮挡H肉动漫在线观看3D | 亲生乖女好紧H下| 7X7X7X任意槽2023进口| 麻花豆传媒剧国产MV在线下载| 亚洲熟女乱色一区二区三区| 精品人妻大屁股白浆无码| 亚洲成AV人片无码天堂下载| 国精产品一区二区三区糖心 | 娇妻初尝粗大滋味借种韩国电影| 小婷又紧又嫩又窄又多水| 国产精品久久久亚洲| 图片区小说区另类春色| 国产成人愉拍精品| 无码人妻精品一区二区| 国产精品18久久久久久不卡 | 国产二级一片内射视频插放| 少妇人妻好深好紧精品无码| 大白屁股白浆XXⅩSS| 少妇被躁爽到高潮无码文 | 少妇饥渴偷公乱A级无码| 成人欧美一区二区三区在线 | 女人三A级毛片视频| √天堂中文WWW官网在线| 末成年女AV片一区二区丫| 777米奇色狠狠888俺也去乱| 欧美黑人XXXX| 拔萝卜全程不该盖被子怎么办| 日本久久99成人网站| 大欧派拔萝卜游戏| 太多了太满了肚子装不下了| 国产AV激情久久无码天堂| 推高她的裙子挺身而入| 国产偷国产偷精品高清尤物| 亚洲AV中文无码字幕色本草| 精品久久无码中文字幕| 一本久道久久综合狠狠爱| 裸体丰满白嫩大尺度尤物| 91精品人妻一区二区三区蜜蜜挑| 欧美无人区码卡二三卡四卡| 潮喷无码正在播放| 熟女体下毛毛黑森林| 国产精品无码翘臀在线看| 亚洲AV永久无码精品一区二区不| 精品人亚洲成A人片在线观看无码专区| 亚洲午夜精品久久久久久人妖| 久久青青草原精品国产APP| 50岁毛多熟女一区二区三区| 日本丰满护士爆乳XXⅩ | 啊灬啊灬啊灬快灬高潮了视频网站 | 亚洲国产美女精品久久久久∴ | 日本人妻丰满熟妇久久久久久| 国产★浪潮AV无码性色| 亚洲 自拍 另类小说综合图区| 久久AV无码精品人妻系列果冻| 中文字幕色偷偷人妻久久| 人与畜禽CROPROATION| 国产精品99久久免费| 亚洲国产精品无码久久一线| 鲁一鲁一鲁一鲁一澡| 被两个老头咬住吃奶野战| 无码AV不卡一区二区三区| 精品久久久久久无码人妻VR| 做I爱直播APP| 色五月丁香五月综合五月4438| 国内精品久久久久精免费| 尤物AV无码色AV无码麻豆| 欧美一进一出抽搐大尺度视频 | 高潮喷视频在线无码| 亚洲成AⅤ人的天堂在线观看女人 亚洲成A∨人片在线观看不卡 | 国产94在线 | 亚洲| 亚洲国产精品无码久久一线| 女人大胆张开荫道口∞| 国产AV无码国产AV毛片| 亚洲人成网亚洲欧洲无码久久| 欧美大肚子孕妇疯狂作爱视频| 国产成人精品午夜视频| 亚洲色精品88色婷婷七月丁香| 欧美极品JIZZHD欧美| 国产精品无码一区二区三区| 伊人久久大香线蕉AV一区| 日日碰狠狠添天天爽超碰97| 幻女FREE性俄罗斯毛片| BGMBGMBGM老少配| 香蕉免费一区二区三区| 免费无码又爽又刺激高潮软件| 国产白丝护士AV在线网站| 亚洲中文字幕乱码电影| 日韩精品无码中文字幕一区二区| 护士被弄到高潮喷水抽搐| JIZZ成熟丰满韩国女人.| 亚洲AV成人午夜在线看见网站| 男生白内裤自慰GV白袜男同 | 美区APPSTORE精品| 国产极品视觉盛宴专区 | 国产精品AV无码毛片久久| 在线国内永久免费CRM| 天堂8在线新版官网|