本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
驗證 JSON Web Token
這些步驟描述有關驗證使用者集區 JSON Web Token (JWT)。
Prerequisites
本節中的任務可能已經由您的庫、SDK或軟件框架處理。例如,在客戶端上通過 Amazon Cognito SDK。同樣, Mobile SDK for iOS 以及 適用於 Android 的 Mobile SDK 如果滿足兩個條件,將自動刷新您的ID並訪問令牌: 必須提供有效的(未過期)刷新令牌,ID和訪問令牌的有效期必須至少爲5分鐘。如需 JavaScript、Android 和 iOS 適用的軟體開發套件 (SDK) 和範本程式碼,請參閱 Amazon Cognito 使用者集區 SDK。
許多優秀的庫可用於解碼和驗證JSONWeb令牌(JWT)。如果您需要手動處理用於服務器端API處理的令牌,或者使用其他編程語言,這些庫可能會有所幫助。請參閱可搭配 JWT 字符使用的 OpenID Foundation 程式庫清單
步驟 1:確認 JWT 的結構
JSON Web Token (JWT) 包含三個部分:
-
標頭
-
:承載
-
簽章
11111111111.22222222222.33333333333 |
這些部分編碼爲base64url字符串,並用點(.)字符分隔。如果您的JWT不符合此結構,則視爲無效,不接受。
步驟 2. 驗證 JWT 簽章
JWT簽名是標頭和有效負載的散列組合。 Amazon Cognito 爲每個用戶池生成兩對RSA密碼密鑰。其中一個私有金鑰是用來簽署字符。
驗證 JWT 字符的簽章
-
解碼 ID 字符。
您可以使用 AWS Lambda 來解碼使用者集區 JWT。有關更多信息,請參閱 解碼和驗證 Amazon Cognito JWT令牌使用 Lambda
. OpenID Foundation 也會提供可搭配 JWT 字符使用的程式庫清單
。 -
比較本地密鑰ID(
kid
)給公衆。-
下載並存放對應至您的使用者集區的公開 JSON Web Key (JWK)。JSON Web Key Set (JWKS) 中會提供這個金鑰。您可以在https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json找到它。
如需 JWK 和 JWK Set 的詳細資訊,請參閱 JSON Web Key (JWK)
。 注意 這是一次性步驟,之後 Web API 才能處理字符。現在您可以在每次搭配 Web API 使用 ID 字符或存取字符時,執行下列步驟。
這是一個樣本
jwks.json
文件:{ "keys": [{ "kid": "1234example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "1234567890", "use": "sig" }, { "kid": "5678example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "987654321", "use": "sig" }] }
- 密鑰ID(
kid
) -
的
kid
是一個提示,指示用於保護令牌的JSONWeb簽名(JWS)的密鑰。 - 算法(
alg
) -
這個
alg
標頭參數代表用來保護 ID 字符安全的加密演算法。使用者集區是使用 RS256 演算法,即採用 SHA-256 的 RSA 簽章。如需 RSA 的詳細資訊,請參閱 RSA 加密法。 - 密鑰類型(
kty
) -
這個
kty
參數會識別搭配金鑰 (本範例中的金鑰為 RSA) 的加密演算法系列。 - RSA指數(
e
) -
這個
e
參數包含 RSA 公開金鑰的指數值。它以 Base64urlUInt 編碼值表示。 - RSA模量(
n
) -
這個
n
參數包含 RSA 公開金鑰的模數值。它以 Base64urlUInt 編碼值表示。 - 使用(
use
) -
這個
use
參數描述公開金鑰的用途。對於本示例,use
價值sig
表示簽名。
- 密鑰ID(
-
搜索公共JSONWeb密鑰
kid
與kid
JWT的。
-
-
使用公開金鑰,驗證使用您的 JWT 程式庫的簽章。您可能需要先將 JWK 轉換成 PEM 格式。這個範例處理了 JWT 和 JWK,並且使用 Node.js 程式庫、jsonwebtoken 來驗證 JWT 簽章:
步驟 3. 驗證宣告
驗證 JWT 宣告
-
確認字符未過期。
-
受衆(
aud
)索賠應與在 Amazon Cognito 用戶池。 -
發行者 (
iss
) 宣告應該符合您的使用者集區。例如,在us-east-1
地區將有以下iss
值:https://cognito-idp.us-east-1.amazonaws.com/
.<userpoolID>
-
檢查
token_use
宣告。-
如果您在 Web API 中只接受存取字符,其值必須是
access
。 -
如果您只使用 ID 字符,其值必須是
id
。 -
如果是同時使用 ID 字符和存取字符,
token_use
宣告必須是id
或access
。
-
您現在可以信任字符內部的宣告。