JSON Web Tokens (JWT) 是一種基於 JSON 格式的輕量級、可自包含的身份驗證標識,它可以作為用戶的身份令牌,用於應用程序和服務器之間的通信。在本文中,我們將探討如何使用JWT生成和驗證Token。
一、JWT簡介
JWT是一種令牌,它由三部分組成:頭部、載荷和簽名。頭部包含令牌的類型以及使用的加密算法。載荷包含用戶身份信息和其他的元數據。簽名是對頭部和載荷進行加密後的字符串。JWT可以被用來作為一個授權標識,在服務端驗證授權後進行某些操作。
下面是JWT的一個例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
其中,使用 . 連接的三個字符串分別為頭部、載荷和簽名,如果將它們拆開並進行解碼,你就可以看到其中包含的信息。
二、JWT生成過程
為了生成JWT,我們可以按照以下步驟進行:
1. 創建載荷
載荷包含了JWT所要傳遞的信息,例如用戶ID、訪問權限等。載荷必須是一個JSON對象,可以包含任意數量的屬性。以下是一個例子:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
其中,sub代表用戶的唯一標識符,name代表用戶名,iat代表令牌的發行時間,可以用來判斷令牌是否過期。
2. 創建頭部
頭部包含了JWT的類型和使用的加密算法。頭部也必須是一個JSON對象,包含兩個屬性:alg和typ。算法可以是HS256、RS256等。
{
"alg": "HS256",
"typ": "JWT"
}
3. 創建簽名
簽名是使用頭部和載荷生成的,在生成簽名時需要指定一些秘密信息。在這個例子中,我們使用SHA256算法和一個密鑰來生成簽名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
其中,秘密信息可以是任何你想要的字符串,只要它足夠長、足夠隨機即可。你應該盡量保護這個秘密信息,否則可能會有人仿冒你的令牌。
4. 將所有部分組合成JWT
最後,我們將頭部、載荷和簽名按照以下格式組合成JWT:
base64UrlEncode(header) + '.' +
base64UrlEncode(payload) + '.' +
base64UrlEncode(signature)
其中,base64UrlEncode是將JSON對象進行URL安全的Base64編碼。
5. 完整示例代碼
const jwt = require('jsonwebtoken');
const secret = 'mysecret';
const payload = {
sub: '1234567890',
name: 'John Doe',
iat: 1516239022
};
const header = {
alg: 'HS256',
typ: 'JWT'
};
const token = jwt.sign(payload, secret, {
header: header,
expiresIn: '1h'
});
console.log(token);
三、JWT驗證過程
在服務端接收到JWT後,我們需要進行驗證來確認它是真實有效的,以下是驗證JWT的一般步驟:
1. 將JWT按照 . 分割成頭部、載荷和簽名三個部分
可以使用以下代碼將JWT解析成JSON對象:
const token = 'your_token_here';
const [headerEncoded, payloadEncoded, signatureEncoded] = token.split('.');
const header = JSON.parse(Buffer.from(headerEncoded, 'base64').toString('utf-8'));
const payload = JSON.parse(Buffer.from(payloadEncoded, 'base64').toString('utf-8'));
2. 確認頭部中的算法和類型是否正確
在頭部中,我們定義了JWT簽名使用的算法和類型,我們需要確認它們是否與預期相符。
3. 使用和生成JWT時相同的秘密信息來生成簽名
在驗證簽名之前,我們需要使用JWT生成時使用的相同秘密信息來生成簽名,然後將生成的簽名與JWT中的簽名進行比對。如果它們不匹配,那麼這個JWT是無效的。
4. 驗證過期時間
當生成JWT時,可以指定它的過期時間,或使用默認值。在驗證JWT時,我們需要檢查iat(發行時間)和exp(過期時間)是否在有效範圍內。如果JWT已經過期,那麼它也是無效的。
5. 完整示例代碼
const jwt = require('jsonwebtoken');
const secret = 'mysecret';
const token = 'your_token_here';
const [headerEncoded, payloadEncoded, signatureEncoded] = token.split('.');
const header = JSON.parse(Buffer.from(headerEncoded, 'base64').toString('utf-8'));
const payload = JSON.parse(Buffer.from(payloadEncoded, 'base64').toString('utf-8'));
jwt.verify(token, secret, { algorithms: ['HS256'] }, (err, decoded) => {
if (err) {
console.error(err.message);
} else {
console.log(decoded);
}
});
四、結論
JWT是一種輕量級、可自包含的身份驗證標識,它可以被用來作為用戶的身份令牌,用於應用程序和服務器之間的通信。在本文中,我們探討了如何使用JWT生成和驗證Token,包括創建載荷、頭部和簽名,將它們組合成JWT,以及如何在服務端接收和驗證JWT。希望本文能對讀者有所幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/230519.html