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 的過程如下:我們對有效負載和標頭進行編碼,然後從中產生簽章。
之前,我們討論如何建立 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 提供了上述所有優點,使其成為大多數授權使用者的身份驗證機制的流行選擇。此外,JWT 可以與各種身份驗證技術一起使用,例如 DPoP 等。
要在程式碼中使用 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中文網其他相關文章!