JSON Web トークンの検証 - Amazon Cognito

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

JSON Web トークンの検証

これらのステップでは、ユーザープール JSON Web トークン (JWT) の検証を説明します。

前提条件

このセクションのタスクは、ライブラリ、SDK、またはソフトウェアフレームワークで既に処理されている可能性があります。 AWS SDKsは、アプリケーションで Amazon Cognito ユーザープールトークンの処理と管理のためのツールを提供します。 AWS Amplify には、Amazon Cognito トークンを取得および更新する関数が含まれています。

詳細については、次のページを参照してください。

JSON ウェブトークン (JWT) のデコードと検証用として、多数のライブラリが用意されています。サーバー側の API 処理用にトークンを手動で処理する場合、または他のプログラミング言語を使用している場合は、これらのライブラリが役に立ちます。「OpenID foundation の JWT トークンでの作業のためのライブラリのリスト」を参照してください。

でトークンを検証する aws-jwt-verify

Node.js アプリでは、 AWS は、ユーザーがアプリに渡すトークンのパラメータを検証するためにaws-jwt-verifyライブラリを推奨します。aws-jwt-verify を使用すると、1 つ以上のユーザープールについて検証したいクレーム値を CognitoJwtVerifier に入力できます。確認できる値には次のものがあります。

Node.js アプリまたは AWS Lambda オーソライザーで使用できる詳細とコード例については、「」のaws-jwt-verify「」を参照してください GitHub。

トークンの理解と検査

トークン検査をアプリに統合する前に、Amazon Cognito が JWT を組み立てる方法を検討してください。ユーザープールからサンプルトークンを取得します。それらをデコードして詳細に調べて特性を理解し、何をいつ検証するかを決定します。例えば、あるシナリオではグループメンバーシップを検証し、別のシナリオではスコープを調べたい可能性があります。

以下のセクションでは、アプリを準備するときに Amazon Cognito JWT を手動で検査するプロセスについて説明します。

JWT の構造を確認します

JSON ウェブトークン (JWT) は、間に . (ドット) 区切り文字がある 3 つのセクションで構成されます。

[Header] (ヘッダー)

Amazon Cognito がトークンの署名に使用したキー ID、kid、および RSA アルゴリズム、alg。Amazon Cognito は RS256alg でトークン署名します。kid は、ユーザープールが保持する 2048 ビット RSA プライベート署名キーへの切り捨てられた参照です。

ペイロード

トークンクレーム。ID トークンでは、クレームには、ユーザー属性とユーザープール、iss、およびアプリクライアント、aud に関する情報が含まれます。アクセストークンのペイロードには、スコープ、グループメンバーシップ、ユーザープールが iss として含まれ、アプリクライアントは client_id として含まれます。

署名

署名は、ヘッダーやペイロードのようにデコード可能な base64 ではありません。JWKS URI で確認できる署名キーとパラメータから派生した RSA256 識別子です。

ヘッダーとペイロードは base64 でエンコードされた JSON です。開始文字 { にデコードされる最初の文字 eyJ で識別できます。ユーザーが base64 でエンコードされた JWT をアプリに提示し、それが形式 [JSON Header].[JSON Payload].[Signature] ではない場合、有効な Amazon Cognito トークンではないため破棄できます。

JWT を検証

JWT 署名は、ヘッダーとペイロードのハッシュされた組み合わせです。Amazon Cognito は、ユーザープールごとに 2 組の RSA 暗号化キーを生成します。1 つの秘密鍵がアクセストークンに署名し、もう 1 つが ID トークンに署名します。

JWT トークンの署名を検証する
  1. ID トークンを復号化します。

    OpenID Foundation では、JWT トークンでの作業のためのライブラリのリストも維持されています

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

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

    1. ユーザープール用に、対応するパブリック JSON Web キー (JWK) をダウンロードして保存します。これは、JSON Web キーセット (JWKS) の一部として提供されており、環境に合わせて次のように jwks_uri URL を構築することで、その場所を特定できます。

      https://cognito-idp.<Region>.amazonaws.com/<userPoolId>/.well-known/jwks.json

      JWK と JWK セットの詳細については、「JSON Web Key (JWK)」を参照してください。

      注記

      Amazon Cognito は、ユーザープール内で署名キーをローテーションする可能性があります。ベストプラクティスとして、kid をキャッシュキーとして使用して、アプリに公開鍵をキャッシュし、定期的にキャッシュを更新してください。アプリが受け取るトークンの kid をキャッシュと比較します。

      正しい発行者で kid が異なるトークンを受け取った場合、Amazon Cognito が署名キーをローテーションした可能性があります。ユーザープール jwks_uri エンドポイントのキャッシュを更新します。

      以下は、サンプル 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" }] }
      Key ID (kid)

      kid は、トークンの JSON ウェブ署名 (JWS) をセキュア化するために使用されたキーを示すヒントです。

      Algorithm (alg)

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

      Key type (kty)

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

      RSA exponent (e)

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

      RSA modulus (n)

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

      Use (use)

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

    2. JWT の kid に一致する kid のパブリック JSON ウェブキーを検索します。

  3. JWT ライブラリを使用して、発行者の署名をトークン内の署名と比較します。発行者の署名は、トークンと一致する jwks.json の kid の公開キー(RSA モジュラス "n")から取得されます。kid。まず、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) { });

クレームを検証する

JWT クレームを検証する
  1. 次のいずれかの方法で、トークンの有効期限が切れていないことを確認します。

    1. トークンをデコードし、exp クレームを現在の時刻と比較します。

    2. アクセストークンに aws.cognito.signin.user.adminクレームが含まれている場合は、 などの API にリクエストを送信しますGetUserアクセストークンで承認する API リクエストは、トークンの有効期限が切れているとエラーを返します。

    3. UserInfo エンドポイント へのリクエストでアクセストークンを提示します。トークンの有効期限が切れている場合、リクエストはエラーを返します。

  2. ID トークンの aud クレームとアクセストークンの client_id クレームは、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 クレームは、id または access になります。

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