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

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

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

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

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

什么是JWT

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

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

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

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

JWT的原理

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

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

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

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

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

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

  • 第二個紫色部分payload,就是一個JSON對象,也就是實際要傳輸的數據,官方有七個字段可以使用:

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

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

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

JWT的簡單使用

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

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

$ npm i express jsonwebtoken nodemon

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

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

第二步:初始化一下node應用,在根目錄下創建app.js文件;

// app.js  const express = require("express"); const app = express();  app.use(express.json());  app.listen(3000, () => {   console.log(3000 + " listening..."); // 監聽3000端口 });

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

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

這里面的jwtKey是我們自定義保存僅限保存在服務器中的私鑰,之后我們開始寫一個 /login 接口,用來登錄,并且創建本地的模擬數據庫用來校驗,并通過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,         });       }     );   } });

上面代碼中我們創建了database變量來模擬創建了本地的賬號密碼數據庫,用來校驗登陸;接下來建立了一個/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;

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

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

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

第三個參數:是簽名的選項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字段,指定了時效時間,使用方法參考這個文檔;

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

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

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

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

什么是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是否有效,這個方法分別有三個參數:

// 有四個接口簽名,可以自行查文檔  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協議中的標準認證方式

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

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

其實

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
伊人久久大香线蕉AV一区二区| 亚洲AV午夜成人影院老师机影院| 脱岳裙子从后面挺进去电影| 无码国内精品人妻少妇| 亚洲AV无码蜜臀久久寂寞少妇| 亚洲国产精品成人一区二区在线 | 小奶瓶(产奶)沈姜| 亚洲欧美精品视频| 中文字幕V亚洲ⅤV天堂| BTА√天堂中文在线官网| 大尺度一对一视频聊天软件| 国产精品亚洲А∨天堂2021| 极品教师第二季免费观看| 老熟女DHXⅩXXX88老妇女| 欧美性猛交╳XXX乱大交| 色妞AV永久一区二区国产AV| 午夜亚洲乱码伦小说区69堂| 亚洲色无码国产精品网站可下载| 2021网站无需下载急急急| 成人欧美一区二区三区在线| 国产人成精品香港三级在线| 久久精品国产99久久香蕉| 欧美交换配乱吟粗大| 少妇与亲子伦系列小说| 亚洲高清国产拍精品动图| 2021最新国产在线人成| 丰满妇女强高潮18ⅩXXXHD| 国语自产拍精品香蕉在线播放| 廖承宇做受被C22分钟视频| 日本丰满熟妇BBXBBXHD| 亚洲AV成人片在线观看香蕉资源| 再深点灬舒服灬太大了下载| 白嫩无码人妻熟妇啪啪区| 国产情侣一区二区三区| 麻豆国产97在线 | 中文| 日韩精品卡2卡3卡4卡5| 亚洲国产精品人人爽夜夜爽| A男人的天堂久久A毛片| 国产欧美久久一区二区| 免费女性裸体啪啪无遮挡网站| 色偷偷色噜噜狠狠网站久久| 亚洲人成人无码WWW影院| S货叫大声点C烂你的SBXS| 国产精品无码AV片在线观看播放| 久久九九精品99国产精品| 日韩欧美视频一区二区| 亚洲欧美日韩在线一区| 插插插精品亚洲一区| 娇妻在客厅被朋友玩得呻吟动漫| 欧美一级 片内射黑人i| 亚洲AV蜜乳永久www| А√ 天堂 在线官网中文| 黑人又大又粗又长欧美网站| 人妻妺妺窝人体色WWW聚色窝| 亚洲国产欧美在线成人| 成年女人WWXX免费国产| 久久久久精品波多野吉衣无码AV | 亚洲精品NV久久久久久久久久| YSL千人千色T9和T9的区别| 狠狠婷婷色五月中文字幕| 日本丰满熟妇人妻aqq| 亚洲熟妇AⅤ无码一区二区| 粉嫩av一区二区精品爆乳| 久久中文字幕AV不卡一区二区| 天天做天天爱夜夜爽毛片毛片| 中文字幕欧美人妻精品一区| 国产啪亚洲国产精品无码| 欧美与黑人午夜性猛交久久久 | 久久久久精品国产三级| 少妇高潮呻吟在线观看| 中央气象台1一7天降水量预报图| 国产免费无遮挡吸奶头视频| 人妻少妇看A偷人无码精品| 亚洲一区蜜桃视频在线| 国产精品久久久久7777| 欧美精品人妻AⅤ在线观视频免费| 亚洲成AV人无码| 大屁股大乳丰满人妻| 免费污站18禁的刺激| 亚洲国产精品久久久久秋霞1| 出差被绝伦上司侵犯中文字幕| 没带罩子让他吃了一天药会怎样 | 精品日产1区2卡三卡麻豆| 熟女肥臀av二区三区四区| √天堂资源在线中文8在线最新版 √天堂资源地址在线官网 | 观看国产色欲色欲色欲WWW| 女人被爽到高潮视频免费国产| 亚洲国产成人久久综合一区77 | 7723影视大全在线观看| 妓女爽爽爽爽爽妓女8888| 天天躁夜夜躁狠狠躁2021| 拔萝卜视频免费观看高清下载| 老年镖客视频大全播放| 亚洲国产成人片在线观看无码| 国产成人精品午夜视频 | 看黄A大片日本真人视频直播| 亚洲AV日韩AⅤ永久无码| 国产99视频精品免费视看9| 人妻少妇HEYZO无码专区| 0D0D肥胖老太婆| 浪货趴办公桌~H揉秘书电影无码| 亚洲AV无码专区亚洲AV手机版| 国产成人精品无码片区| 肉身避风港1978大米星球| www高潮无码免费看| 免费看国产曰批40分钟| 夜夜揉揉日日人人| 精品人妻一区二区三区免费看| 亚洲 欧美 动漫 少妇 自拍| 国产成人无码H在线观看网站| 搡老女人911熟妇老熟女| 办公室的交易HD在线观看| 欧美日韩国产免费一区二区三区| 中国人妻XXXXX免费看| 久久偷看各类WC女厕嘘嘘| 亚洲午夜国产精品无码| 狠狠久久精品中文字幕无码| 午夜成人亚洲理伦片在线观看| 国产成 人 综合 亚洲专区| 日日AV色欲香天天综合网| 办公室撕开奶罩揉吮奶漫画| 欧美一区在线视频| XXXXXHD亚洲日本HD| 人妻仑乱A级毛片免费看| かしこまりました中文在线| 欧洲无线一线二线三W955| CAOPORN免费视频国产| 欧美日韩精品一区二区三区不卡| 99久久99久久精品免费看蜜桃| 女主播屁G裸露W身曝光| AV无码小缝喷白浆在线观看| 欧美一性一乱一交一视频C| ZOOM与人性ZOOM2区别| 日产乱码一二三区别免费看| 成人欧美一区二区三区在线| 色又黄又爽18禁免费网站| 国产AV无码专区亚洲AV毛片搜| 私人医生H1忘记密码了怎么办| 国产成人蜜桃AV无码永久免费| 乌克兰少妇VIDEOS高潮| 国产精品免费看久久久无码| 午夜精品久久久久久中宇| 国精产品 自偷自偷| 亚洲欧美高清一区二区三区| 久久精品无码一区二区WWW| 伊人色综合久久天天| 妺妺窝人体色www在线下载人| ALEXAGRACE大战黑人| 人人妻人人澡人人爽超污 | 护士HD老师FREE性ⅩⅩⅩⅩ| 亚洲国产精品一区二区久久 | 中文中文字幕成人无码AⅤ| 男生女生一起相差差差| 超碰人人爽天天爽天天做| 撕开奶罩揉吮奶头免费视频| 国产亲子伦ⅩⅩⅩⅩX熟妇视频| 亚洲AV伊人久久综合密臀性色| 久久久久久精品毛片A级蜜桃| 重口00Ⅹ变态另类| 日本亲近相奷中文字幕| 隔壁老王国产在线精品| 亚洲AV熟女高潮一区二区| 久久精品九九热无码免贵| 18禁无遮挡啪啪摇乳动态图| 日99久9在线 | 免费| 国产精品成人无码免费| 亚洲精品少妇XXXX| 免费观看高清日本AⅤ| 成年女人18级毛片毛片免费| 无码人妻一区二区三区免水牛视频 | 永久免费AV无码网站在线| 欧美亚洲国产一区二区三区| 肥老熟妇伦子伦456视频| 亚洲AV色香蕉一区二区三区| 老公带朋友来家里C我怎么办| 啊灬啊灬啊灬快灬高潮了霸总 | 国产人与禽ZOZ0性伦| 野花高清完整版免费观看视频电视 | 亚洲成A人片无码不卡| 美女裸体无遮挡免费视频网站| 爱丫爱丫影院电影网| 午夜无码人妻AV大片色欲| 看国产黄大片在线观看| 办公室强肝的播出时间| 午在线亚洲男人午在线| 久久综合亚洲鲁鲁五月天| 成熟丰满女人丰满妇女aⅴ| 亚洲JIZZJIZZ中国少妇| 免费午夜爽爽爽WWW视频十八禁| 高中生被C到爽哭视频| 亚洲午夜精品久久久久久APP| 人妻少妇久久中文字幕| 韩国免费A级作爱片视频| 6080电影网站| 午夜免费无码福利视频| 免费A级毛片无码A∨蜜芽| 国产风流老太婆大BBBHD视频| 婬乱丰满熟妇XXXXⅩ性| 水蜜桃国产精品欧美日韩一区不卡| 久久精品国产精品亚洲精品 |