驗證 JSON Web Token - Amazon Cognito

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

驗證 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) 包含三個部分:

  1. 標頭

  2. :承載

  3. 簽章

11111111111.22222222222.33333333333

這些部分編碼爲base64url字符串,並用點(.)字符分隔。如果您的JWT不符合此結構,則視爲無效,不接受。

步驟 2. 驗證 JWT 簽章

JWT簽名是標頭和有效負載的散列組合。 Amazon Cognito 爲每個用戶池生成兩對RSA密碼密鑰。其中一個私有金鑰是用來簽署字符。

驗證 JWT 字符的簽章

  1. 解碼 ID 字符。

    您可以使用 AWS Lambda 來解碼使用者集區 JWT。有關更多信息,請參閱 解碼和驗證 Amazon Cognito JWT令牌使用 Lambda.

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

  2. 比較本地密鑰ID(kid)給公衆。

    1. 下載並存放對應至您的使用者集區的公開 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 表示簽名。

    2. 搜索公共JSONWeb密鑰 kidkid 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 用戶池。

  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

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