首頁 >web前端 >js教程 >了解 JWT

了解 JWT

王林
王林原創
2024-08-08 13:46:24725瀏覽

智威湯遜是什麼?

JWT 代表 json web token,它是開放標準,用於以 JSON 物件的形式在各​​方之間傳輸訊息。它結構緊湊、URL 安全,並廣泛用於 Web 應用程式中的身份驗證和資訊交換。

JWT 使用金鑰和機密進行數位簽章。我們使用這些金鑰和簽名驗證 JWT 以對使用者進行身份驗證。大多數網路系統使用 JWT 來授權使用者存取某些資源。

代幣組件

JWT 有三個主要元件:標頭、有效負載和簽名。當我們建立令牌時,我們傳遞標頭和負載,然後令牌產生簽名。

Headre - JWT 的標頭包含有關令牌的元資料。它包括三個值:alg、typ 和 kids。 alg指定用於對令牌進行簽署的演算法,typ表示令牌類型,kid是用於識別金鑰的可選參數。是否包含孩子取決於您的用例。

{
  "alg": "RS256", // allow [HS256,RS256,ES256]
  "typ": "JWT", // Specific Type Of token
  "kid": "12345" // Used to indicate which key was used to sign 
the JWT. This is particularly useful when multiple keys are in use
}

有效負載 - 在有效負載中,我們指定一些自訂數據,主要是將使用者特定資料新增至有效負載中,例如使用者 ID 和角色。

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

簽名 - 簽章是透過使用金鑰(對於 HS256)對標頭和負載進行編碼或使用私鑰(對於 RSA)對其進行簽名,然後對結果進行哈希處理來產生的。此簽名用於驗證令牌。

令牌是如何建立的

正如我們所討論的,JWT 有三個元件:標頭、有效負載和簽名。我們提供標頭和有效負載,並根據它們產生簽名。組合所有這些組件後,我們創建了令牌。

// Header Encoding
Base64Url Encode({
  "alg": "RS256",
  "typ": "JWT"
}) → eyJhbGciOiAiUlMyNTYiLCAidHlwIjogIkpXVCJ9


// Payload Encoding
Base64Url Encode({
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}) → eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImlhdCI6IDE1MTYyMzkwMjJ9


// Concatenate Encoded header and payload
ConcatenatedHash =  Base64Url Encode(Header) + "." + Base64Url Encode(Payload)

//Create Signature
Hash = SHA-256(ConcatenatedHash)
Signature = RSA Sign(Hash with Private Key) or HS256 Sign(Hash with secrate)

// Create Token
Token = Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload) +"."+ Signature

因此,建立 JWT 的過程如下:我們對有效負載和標頭進行編碼,然後從中產生簽章。

Understanding the JWT

驗證 JWT 令牌

之前,我們討論如何建立 JWT。現在,我們來討論如何驗證 JWT。驗證過程本質上是令牌創建的逆過程。首先,我們使用秘密或公鑰解密令牌。然後,我們連接標頭和有效負載以產生簽名。如果產生的哈希與簽章匹配,則令牌有效;否則無效。

// Token we recive in this formate
Token = Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload) +"."+ Signature

// Decrypt Signature
TokenHash = RSA Decrypt(Hash with Public Key) or HS256 Sign(Hash with secrate)

// Generate Hash From Encoded Header and Payload
Hash = SHA-256(Base64UrlEncode(Header) +"."+ Base64UrlEncode(Payload))

// Compare Hash
if(TokenHash == Hash) "Valid"
else "Not Valid"

使用 JWT 的好處

  1. 安全性 - JWT 經過數位簽名,確保資料的完整性和真實性
  2. 緊湊 - JWT 體積小,使其能夠有效率地透過網路傳輸。
  3. 自包含 - JWT 包含有關用戶的所有必要信息,減少了多次查詢資料庫的需要。

JWT 提供了上述所有優點,使其成為大多數授權使用者的身份驗證機制的流行選擇。此外,JWT 可以與各種身份驗證技術一起使用,例如 DPoP 等。

如何在程式碼中使用 JWT

要在程式碼中使用 JWT,我們使用 jsonwebtoken npm 套件。使用 JWT 有兩種方法:使用金鑰的簡單方法和金鑰對方法(使用公鑰和私鑰)。

使用秘密

import jwt from 'jsonwebtoken';

// Define the type for the payload
interface Payload {
  userId: number;
  username: string;
}

// Secret key for signing the JWT
const secretKey: string = 'your-very-secure-secret';

// Payload to be included in the JWT
const payload: Payload = {
  userId: 123,
  username: 'exampleUser'
};

// Sign the JWT
const token: string = jwt.sign(payload, secretKey, { expiresIn: '1h' });
console.log('Generated Token:', token);
import jwt from 'jsonwebtoken';

// Secret key for signing the JWT
const secretKey: string = 'your-very-secure-secret';

// Verify the JWT
try {
  const decoded = jwt.verify(token, secretKey) as Payload;
  console.log('Decoded Payload:', decoded);
} catch (err) {
  console.error('Token verification failed:', (err as Error).message);
}

使用密鑰對方法

import * as jwt from 'jsonwebtoken';
import { readFileSync } from 'fs';

// Load your RSA private key
const privateKey = readFileSync('private_key.pem', 'utf8');

// Define your payload
const payload = {
  sub: '1234567890',
  name: 'John Doe',
  iat: Math.floor(Date.now() / 1000) // Issued at
};

// Define JWT sign options
const signOptions: jwt.SignOptions = {
  algorithm: 'RS256',
  expiresIn: '1h' // Token expiration time
};

// Generate the JWT
const token = jwt.sign(payload, privateKey, signOptions);
console.log('Generated JWT:', token);
import * as jwt from 'jsonwebtoken';
import { readFileSync } from 'fs';

// Load your RSA public key
const publicKey = readFileSync('public_key.pem', 'utf8');

// Define JWT verify options
const verifyOptions: jwt.VerifyOptions = {
  algorithms: ['RS256'] // Specify the algorithm used
};

try {
  // Verify the JWT
  const decoded = jwt.verify(token, publicKey, verifyOptions) as jwt.JwtPayload;

  console.log('Decoded Payload:', decoded);
} catch (error) {
  console.error('Error verifying token:', error);
}

結論

總之,JSON Web Tokens (JWT) 使用緊湊的格式在各方之間安全地傳輸訊息。 RSA 簽署和驗證涉及使用私鑰進行簽署和公鑰進行驗證。 TypeScript 範例說明了使用 RSA 私鑰產生 JWT 並使用 RSA 公鑰對其進行驗證,確保基於令牌的安全性驗證和資料完整性。

以上是了解 JWT的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn