メニュー
Amazon Cognito
開発者ガイド

JSON ウェブトークンの検証

これらのステップでは、ユーザープールの JSON ウェブトークン (JWT) について説明します。

前提条件

  • このセクションでは、ライブラリ、SDK、ソフトウェアフレームワークで既に処理されている可能性のあるタスクを示します。たとえば、ユーザープールトークンの処理や管理は、Amazon Cognito SDK を使用してクライアント側で行われます。同様に、有効な (期限が切れていない) 更新トークンが存在し、アクセストークンの有効時間が 5 分以上残っている場合、Mobile SDK for iOS および Mobile SDK for Android では、ID とアクセストークンは自動的に更新されます。SDK、JavaScript のサンプルコード、Android、および iOS については、「Amazon Cognito ユーザープールの SDK」を参照してください。

  • サーバー側の API 処理用にトークンを手動で処理する必要がある場合や、他のプログラミング言語を使用している場合は、JWT をデコードして検証するためのライブラリが多数あります。「JWT トークンで使用するライブラリの OpenID Foundation リスト」を参照してください。

ステップ 1: JWT の構造を確認する

JSON ウェブトークン (JWT) は、次の 3 つのセクションで構成されます。

  1. ヘッダー

  2. Payload

  3. 署名

11111111111.22222222222.33333333333

Base64url 文字列でエンコードされ、ドット「.」で区切られています。文字. JWT がこの構造に準拠していない場合は、無効とみなし、使用しないでください。

ステップ 2: JWT 署名を検証する

JWT 署名は、ヘッダーとペイロードのハッシュされた組み合わせです。Amazon Cognito では、ユーザープールごとに 2 組の RSA 暗号化キーが生成されます。プライベートキーの 1 つは、トークンの署名に使用されます。

JWT トークンの署名を確認するには

  1. ID トークンをデコードします。

    1. ユーザープール JWT をデコードするには、AWS Lambda を使用できます。詳細については、「Lambda を使用した Amazon Cognito JWT トークンのデコードと検証」を参照してください。

    2. また、OpenID Foundation では、JWT トークンで使用するライブラリのリストが管理されます

  2. ローカルのキー ID (kid) とパブリックの kid を比較します。

    1. ユーザープールの対応するパブリック JSON ウェブキー (JWK) をダウンロードして保存します。JSON ウェブキーセット (JWKS) の一部として使用できます。それらを https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json で検索できます。

      JWK および JWK セットの詳細については、「JSON ウェブキー (JWK)」を参照してください。

      注記

      これは、ウェブ API でトークンを処理する前の 1 度限りのステップです。ウェブ 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 ウェブ署名 (JWS) を保護するために使用されたキーを示すヒントです。

      アルゴリズム (alg)

      alg ヘッダーパラメータは、ID トークンを保護する暗号化アルゴリズムを表します。ユーザープールでは、SHA-256 を使用した RSA 署名である、暗号化アルゴリズム (RS256) が使用されています。RSA の詳細については、「RSA 暗号化」を参照してください。

      キーのタイプ (kty)

      kty パラメータは、この例の「RSA」など、キーで使用する暗号化アルゴリズムファミリーを識別します。

      RSA 指数 (e)

      e パラメータには、RSA パブリックキーの指数値が含まれます。Base64urlUInt でエンコードされた値として表されます。

      RSA モジュラス (n)

      n パラメータには、RSA パブリックキーのモジュラス値が含まれます。Base64urlUInt でエンコードされた値として表されます。

      用途 (use)

      use パラメータは、パブリックキーの用途を表します。この例の use 値の sig は署名を表します。

    2. パブリックの JSON ウェブキーを使用して、JWT の kid に一致する kid を探します。

  3. JWT ライブラリを使用して署名を検証するには、このパブリックキーを使用します。まず、JWK を PEM 形式に変換する必要がある場合があります。この例では、JWT および JWK を取得し、Node.js ライブラリ、jsonwebtoken を使用して JWT 署名を検証します。

    Node.js
    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 クレームを確認します。

    • ウェブ API でアクセストークンのみを受け入れている場合、その値は access にする必要があります。

    • ID トークンのみを使用している場合、その値は id にする必要があります。

    • ID とアクセストークンのいずれも使用している場合、token_use クレームは、id または access になります。

トークン内でクレームを信頼できるようになりました。