node.js express JWT token生成與校驗的實現(xiàn)
JWT
JWT 是輕量級的數(shù)據(jù)交換格式,相對于傳統(tǒng)的 Session 機制,JWT 不需要在服務(wù)器端存儲會話信息,而是將所有必要的信息包含在令牌本身中。
生成驗證流程
用戶賬號密碼注冊或登錄,服務(wù)端用HMACSHA256根據(jù)secret和base64Url編碼后的header和payload進行加密生成signature,然后將base64Url編碼后的header和payload以及signature通過“.”相連接,最終形式xxxx.yyyy.zzzz(token),之后用戶每次請求資源的時候?qū)⒃L問令牌token放在請求頭中,服務(wù)端在驗證其是否有效之后,返回相對應(yīng)的資源信息。
header(標(biāo)頭)
生成token的頭信息,通常由兩部分組成,包含令牌類型alg和所使用的簽名算法typ
{ "alg":"HS256", "typ":"JWT" }
payload(有效負(fù)載)
通常包括生成jwt的非隱私信息,用戶的唯一標(biāo)識符id,發(fā)行時間iat,到期時間exp
{ "id": "655c78ccd9107661e41abd9f", "iat": 1702260106, "exp": 1710036106 }
signature(簽名)
HMAC-SHA256(Hash Message Authentication Code-Secure Hash Algorithm 256 bit)是一種加密算法,是SHA-256散列函數(shù)與一個密鑰結(jié)合的身份驗證方法。HMAC的安全性基于散列函數(shù)(SHA-256),而且可以通過密鑰的添加來增加信任度。此算法經(jīng)常用于網(wǎng)絡(luò)領(lǐng)域中,例如 HTTPS、SSL、SSH 等加密通訊領(lǐng)域。
生成signature:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
訪問令牌(token)
base64UrlEncode(header) + '.' + base64UrlEncode(payload) + '.' + signature
舉例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY1NWM3OGNjZDkxMDc2NjFlNDFhYmQ5ZiIsImlhdCI6MTcwMjI2MDEwNiwiZXhwIjoxNzEwMDM2MTA2fQ.ca-J91WaThntP3IhMBQNps9MVqts8oi_f62KcV2r4D8
express jwt生成、驗證
1、安裝jsonwebtoken依賴,npm install jsonwebtoken --save
2、在代碼controller層引入依賴,在登錄、注冊的時候生成token
//環(huán)境變量,通過安裝dotenv依賴,在express入口文件中加載, 這么做的目的是不讓密鑰等敏感信息硬編碼在代碼中 JWT_SECRET=this-is-my-secret-password JWT_EXPIRES_IN=90d
生成jwt
// authController.js 用戶的登錄、注冊、密碼修改、token生成、權(quán)限校驗、憑證認(rèn)證等 const jwt = require('jsonwebtoken'); const signToken = id => { return jwt.sign({ id }, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRES_IN }); };
驗證jwt
promisify(jwt.verify)(token, process.env.JWT_SECRET);
const { promisify } = require('util'); // protect中間件, 用于驗證用戶 exports.protect = catchAsync(async (req, res, next) => { let token; if ( req.headers.authorization && req.headers.authorization.startsWith('Bearer') ) { token = req.headers.authorization.split(' ')[1]; } if (!token) { return next( new AppError('您還還沒有登錄或注冊', 401) ); } // 2) 驗證 token const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET); // 驗證jwt是否有效,decode信息是payload,其中包含用戶生成jwt的id、iat、exp // 通過這個唯一id可以查詢用戶信息,如果promisify是rejected則進行錯誤處理邏輯 });
到此這篇關(guān)于node.js express JWT token生成與校驗的實現(xiàn)的文章就介紹到這了,更多相關(guān)express JWT token生成與校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js和Express中設(shè)置TypeScript的實現(xiàn)步驟
本文主要介紹了Node.js和Express中設(shè)置TypeScript的實現(xiàn)步驟文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11我的Node.js學(xué)習(xí)之路(四)--單元測試
在專業(yè)化的軟件開發(fā)過程中,無論什么平臺語言,現(xiàn)在都需要UnitTest單元測試. Node.js有built-in的Assert。 今天讓我們來看一下Node.js的單元測試。在這兒我們使用nodeunit2014-07-07nodejs服務(wù)搭建教程 nodejs訪問本地站點文件
這篇文章主要為大家詳細(xì)介紹了nodejs服務(wù)搭建教程,訪問本地站點文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04Nodejs處理Json文件并將處理后的數(shù)據(jù)寫入新文件中
這篇文章主要介紹了Nodejs處理Json文件并將處理后的數(shù)據(jù)寫入新文件中,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10node.js學(xué)習(xí)總結(jié)之調(diào)式代碼的方法
調(diào)式代碼很多時候類似于查案一樣,只是結(jié)果的重要程度不同,警察查案為的是人民安穩(wěn),而我們調(diào)式則是為了系統(tǒng)的安穩(wěn)。既然這樣我們就不要冤枉任何一段代碼和程序,以免他們受到不合理的懲罰。2014-06-06