驗證 JSON Web Token - Amazon Cognito

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

驗證 JSON Web Token

這些步驟描述有關驗證使用者集區 JSON Web Token (JWT)。

Prerequisites

本節中的任務可能已由您的程式庫、軟體開發套件或軟體架構完成處理。例如,使用者集區字符的處理和管理任務,就是在用戶端透過 Amazon Cognito SDK 提供。同樣地,適用於 iOS 的行動 SDK 和 Android 的行動 SDK 會自動重新整理您的 ID 和存取權杖,如果符合兩個條件:必須存在有效 (未過期) 重新整理字符,而且 ID 字符和存取字符的有效性至少還剩餘 5 分鐘。如需 JavaScript、Android 和 iOS 適用的 SDK 和範本程式碼,請參閱Amazon Cognito 使用者集區 SDK

許多好的程式庫可用於 JSON Web Token (JWT) 解碼和驗證。如果您需要手動處理字符以處理伺服器端 API,或者您使用的是其他程式設計語言,這些程式庫可以提供幫助。請參閱可搭配 JWT 字符使用的 OpenID Foundation 程式庫清單

步驟 1:確認 JWT 的結構

JSON Web Token (JWT) 包含三個部分:

  1. 標頭

  2. 承載

  3. 簽章

11111111111.22222222222.33333333333

這些區段會編碼為 base64url 字串,並以點 (.) 字元區隔。如果您的 JWT 不符合此結構,請將其視為無效,並且拒絕接受。

步驟 2:驗證 JWT 簽章

JWT 簽章是標頭和承載的雜湊組合。Amazon Cognito 會為每個使用者集區產生兩組 RSA 加密金鑰對。其中一個私有金鑰是用來簽署字符。

驗證 JWT 字符的簽章

  1. 解碼 ID 字符。

    您可以使用 AWS Lambda 來解碼使用者集區 JWT。如需更多詳細資訊,請參閱。使用 Lambda 解碼及驗證 Amazon Cognito JWT 字符

    OpenID Foundation 也會提供可搭配 JWT 字符使用的程式庫清單

  2. 比較本機金鑰 ID (kid) 給公開 kid。

    1. 下載並存放對應至您的使用者集區的公開 JSON Web Key (JWK)。JSON Web Key Set (JWKS) 中會提供這個金鑰。您可以在 https://cognito-idp 上找到它。 {區域} .amazonaws.com/ {userPoolId} /.知識/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是指出在保護字符之 JSON Web Signature (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 參數描述公開金鑰的用途。在此範例中,usesig代表簽章。

    2. 搜尋公開 JSON Web Keykid,符合kid你的 JWT。

  3. 使用公開金鑰,驗證使用您的 JWT 程式庫的簽章。您可能需要先將 JWK 轉換成 PEM 格式。這個範例會使用 JWT 和 JWK,並且使用 Node.js 程式庫、jsonwebtoken 來驗證 JWT 簽章:

    Node.js
    var jwt = require('jsonwebtoken'); var jwkToPem = require('jwk-to-pem'); var pem = jwkToPem(jwk); jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) { });

步驟 3:驗證宣告

驗證 JWT 宣告

  1. 確認字符未過期。

  2. 對象 (aud) 宣告應該要符合在 Amazon Cognito 使用者集區中所建立的應用程式用戶端 ID。

  3. 發行者 (iss) 宣告應該符合您的使用者集區。例如,在us-east-1區域將有以下iss值:

    https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>.

  4. 檢查 token_use宣告。

    • 如果您在 Web API 操作中只接受存取字符,其值必須是access

    • 如果您只使用 ID 字符,其值必須是 id

    • 如果是同時使用 ID 字符和存取字符,token_use 宣告必須是 idaccess

您現在可以信任字符內部的宣告。