JWT是指JSON Web Token,是一種基於JSON格式的用於進行身份認證的令牌。它可以將用戶身份信息以JSON格式進行編碼,並採用數字簽名的方式保證其不被篡改。JWT可以通過在HTTP請求頭中傳遞它來實現跨域身份認證,從而實現無狀態分散式認證。
一、JWT的組成部分
JWT由三部分組成:Header、Payload和Signature。
1、Header
Header是一個JSON對象,包含兩個欄位,分別是
{
"typ": "JWT",
"alg": "HS256"
}
其中typ表示token的類型,固定為JWT;alg表示token簽名的演算法。HS256表示HMAC-SHA256。
2、Payload
Payload是真正的用戶信息,在編碼時需要遵循一定規範,一般包含以下欄位:
{
"sub": "123", // 主題,一般指用戶ID
"name": "user", // 用戶名
"iat": 1626938727, // token簽發時間
"exp": 1627101527, // token過期時間
"iss": "www.example.com", // token簽發者
"aud": "www.example.com" // token接收者
}
3、Signature
Signature用於保證token不被篡改。它由Header和Payload以及秘鑰進行數字簽名生成。生成方法如下:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload), secret)
其中,HMACSHA256表示採用HMAC-SHA256演算法進行簽名;secret為秘鑰。
二、使用JWT進行身份認證
使用JWT進行身份認證有以下幾個步驟:
1、用戶登錄
用戶使用用戶名和密碼登錄系統,伺服器檢查用戶信息是否正確,正確則生成一個JWT並返回給用戶。
2、在請求頭中攜帶JWT
用戶在後續的HTTP請求中,需要在請求頭中攜帶該JWT,格式如下:
Authorization: Bearer <JWT>
其中Authorization為請求頭名稱,Bearer是類型,<JWT>為實際JWT。
3、伺服器驗證JWT並解碼
伺服器需要從請求頭中獲取JWT並進行驗證,驗證需要使用到JWT的簽名演算法和秘鑰,驗證通過之後可以對JWT進行解碼獲取用戶身份信息。
三、使用jsonwebtoken庫進行JWT的生成和解碼
jsonwebtoken庫是使用Node.js進行JWT生成和解碼的常用庫之一。使用jsonwebtoken庫可以快速、簡便地實現JWT的生成和解碼。
1、生成JWT
使用jsonwebtoken庫生成JWT的示例代碼如下:
const jwt = require('jsonwebtoken');
const token = jwt.sign({
sub: '123',
name: 'user',
iat: Math.floor(Date.now() / 1000),
exp: Math.floor(Date.now() / 1000) + (60 * 60),
iss: 'www.example.com',
aud: 'www.example.com'
}, 'secret'); // secret為秘鑰
console.log(token);
2、解碼JWT
使用jsonwebtoken庫解碼JWT的示例代碼如下:
const jwt = require('jsonwebtoken');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoidXNlciIsImlhdCI6MTYyNjkzODcyNywiZXhwIjoxNjI3MDExNTI3LCJpc3MiOiJ3d3cuZXhhbXBsZS5jb20iLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20ifQ.mnM_7X9bouqYuoWZ5d2UcVen3iHjf2k6-5N2KZtERvs';
const decoded = jwt.verify(token, 'secret'); // secret為秘鑰
console.log(decoded);
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/156642.html