翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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
に入力できます。確認できる値には次のものがあります。
-
アクセストークンや ID トークンの形式が不正ではなく、期限切れでもなく、有効な署名が付いているもの。
-
アクセストークンが、正しいユーザープールとアプリクライアント
から取得されたもの。 -
アクセストークンクレームに、正しい OAuth 2.0 スコープ
が含まれているもの。 -
アクセストークンと ID トークンに署名したキーが、ユーザープールの JWKS URI の
kid
署名キーと一致していること。 JWKS URI には、ユーザーのトークンに署名した秘密鍵に関する公開情報が含まれています。ユーザープールの JWKS URI は、
https://cognito-idp.
で確認できます。<Region>
.amazonaws.com/<userPoolId>
/.well-known/jwks.json
Node.js アプリまたは AWS Lambda オーソライザーで使用できる詳細とコード例については、「」のaws-jwt-verify
トークンの理解と検査
トークン検査をアプリに統合する前に、Amazon Cognito が JWT を組み立てる方法を検討してください。ユーザープールからサンプルトークンを取得します。それらをデコードして詳細に調べて特性を理解し、何をいつ検証するかを決定します。例えば、あるシナリオではグループメンバーシップを検証し、別のシナリオではスコープを調べたい可能性があります。
以下のセクションでは、アプリを準備するときに Amazon Cognito JWT を手動で検査するプロセスについて説明します。
JWT の構造を確認します
JSON ウェブトークン (JWT) は、間に .
(ドット) 区切り文字がある 3 つのセクションで構成されます。
- [Header] (ヘッダー)
-
Amazon Cognito がトークンの署名に使用したキー ID、
kid
、および RSA アルゴリズム、alg
。Amazon Cognito はRS256
のalg
でトークン署名します。 - ペイロード
-
トークンクレーム。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 トークンの署名を検証する
-
ID トークンを復号化します。
OpenID Foundation では、JWT トークンでの作業のためのライブラリのリストも維持されています
。 を使用して AWS Lambda ユーザープール JWTsデコードすることもできます。詳細については、「 を使用した Amazon Cognito JWT トークンのデコードと検証 AWS Lambda
」を参照してください。 -
ローカルキー ID (
kid
) とパブリックkid
を比較します。-
ユーザープール用に、対応するパブリック JSON Web キー (JWK) をダウンロードして保存します。これは、JSON Web キーセット (JWKS) の一部として提供されており、環境に合わせて次のように
jwks_uri
URL を構築することで、その場所を特定できます。https://cognito-idp.
<Region>
.amazonaws.com/<userPoolId>
/.well-known/jwks.jsonJWK と 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
が署名を表しています。
- Key ID (
-
JWT の
kid
に一致するkid
のパブリック JSON ウェブキーを検索します。
-
-
JWT ライブラリを使用して、発行者の署名をトークン内の署名と比較します。発行者の署名は、トークンと一致する jwks.json の
kid
の公開キー(RSA モジュラス"n"
)から取得されます。kid
。まず、JWK を PEM 形式に変換する必要がある場合があります。次の例には JWT と JWK があり、Node.js ライブラリの jsonwebtokenを使用して JWT 署名を検証します。
クレームを検証する
JWT クレームを検証する
-
次のいずれかの方法で、トークンの有効期限が切れていないことを確認します。
-
トークンをデコードし、
exp
クレームを現在の時刻と比較します。 -
アクセストークンに
aws.cognito.signin.user.admin
クレームが含まれている場合は、 などの API にリクエストを送信しますGetUser。アクセストークンで承認する API リクエストは、トークンの有効期限が切れているとエラーを返します。 -
UserInfo エンドポイント へのリクエストでアクセストークンを提示します。トークンの有効期限が切れている場合、リクエストはエラーを返します。
-
-
ID トークンの
aud
クレームとアクセストークンのclient_id
クレームは、Amazon Cognito ユーザープールで作成されたアプリクライアント ID と一致する必要があります。 -
発行者 (
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
になります。
-
これで、トークン内のクレームを信頼できるようになりました。