Amazon Cognito ユーザープールを自分のアプリケーション用の認証メソッドとして使用したいと思っています。クライアントからアプリケーションに送られる ID とアクセストークンを検証するセキュアな方法とは何ですか?

クライアントがユーザープールを使用してアプリケーションに対して認証を行うと、Amazon Cognito から ID トークンが送られます。以下のような場合は、この ID トークンを手動で検証できます。

  • ウェブアプリケーションを作成済みであり、Amazon Cognito ユーザープールを認証に使用する場合。
  • Amazon Cognito ユーザープールを認証に使用し、Amazon Cognito ID プールを AWS Security Token Service (AWS STS) の一時的な認証情報の取得に使用する場合。この認証情報を使用して AWS Lambda が呼び出されますが、Lambda にはユーザープールを使用して最初に認証したユーザーに関する情報がありません。

Amazon Cognito JSON ウェブトークン (JWT) に含まれている Amazon Cognito ユーザーの詳細を取得するには、トークンを復号して署名を検証できます。AWS Lambda を使用して Amazon Cognito JWT を復号して検証する方法を示すコード例については、GitHub ウェブサイトの「Decode and verify Amazon Cognito JWT tokens (Amazon Cognito JWT トークンを復号して検証する)」を参照してください。

ユーザーがログインすると、Amazon Cognito ユーザープールから JWT が返されます。これは Base64 でエンコードされた JSON 文字列であり、ユーザーに関する情報 (クレームと呼ばれます) が含まれています。Amazon Cognito は、ID トークン、アクセストークン、および更新トークンという、3 つのトークンを返します。ID トークンには、Amazon Cognito ユーザープールで定義されたユーザーフィールドが含まれています。

トークンは、ヘッダー、ペイロード、署名の 3 つのセクションで構成されます。

サンプルの ID トークンのヘッダーを次に示します。ヘッダーには、キー ID ("kid") と、トークンの署名に使用されるアルゴリズム ("alg") が含まれています。この例で、アルゴリズムの "RS256" は、SHA-256 を使用した RSA 署名です。

{
  "kid": "abcdefghijklmnopqrsexample=",
  "alg": "RS256"
}

次にペイロードの例を示します。ユーザーに関する情報と、トークンの作成および有効期限のタイムスタンプが含まれています。

{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-example",
  "aud": "xxxxxxxxxxxxexample",
  "email_verified": true,
  "token_use": "id",
  "auth_time": 1500009400,
  "iss": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_example",
  "cognito:username": "anaya",
  "exp": 1500013000,
  "given_name": "Anaya",
  "iat": 1500009400,
  "email": "anaya@example.com"
}

最後のセクションは署名です。ヘッダーとペイロードの組み合わせをハッシュして暗号化したものです。

Amazon Cognito はユーザープールごとに 2 つの RSA キーペアを生成します。各ペアのプライベートキーは、各 ID トークンまたはアクセストークンの署名に使用されます。パブリックキーは、次の形式のアドレスで使用されます。

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

JSON ファイル (jwks.json) の構造は次の形式になっています。

{
    "keys": [{
        "alg": "RS256",
        "e": "AQAB",
        "kid": "abcdefghijklmnopqrsexample=",
        "kty": "RSA",
        "n": "lsjhglskjhgslkjgh43lj5h34lkjh34lkjht3example",
        "use": "sig"
    }, {
        "alg":
        "RS256",
        "e": "AQAB",
        "kid": "fgjhlkhjlkhexample=",
        "kty": "RSA",
        "n": "sgjhlk6jp98ugp98up34hpexample",
        "use": "sig"
    }]
}

Amazon Cognito JWT の署名を検証するには、まず、トークンのヘッダーのキー ID と一致するキー ID を持つパブリックキーを探します。次に、ライブラリ (jwt.ioOpenID Foundation が推奨するものなど) を使用してトークンの署名を検証し、有効期限やユーザー名などの値を抽出できます。

ベストプラクティスとしては、署名とは別に以下も検証します。

  • トークンの有効期限が切れていないこと。
  • ペイロードに指定された対象者 ("aud") が、Amazon Cognito ユーザープールで作成されたアプリクライアント ID と一致していること。

AWS Lambda を使用して Amazon Cognito JWT を復号して検証する方法を示すコード例については、「Decode and verify Amazon Cognito JWT tokens (Amazon Cognito JWT トークンを復号して検証する)」を参照してください。


このページは役に立ちましたか? はい | いいえ

AWS サポート ナレッジ センターに戻る

サポートが必要ですか? AWS サポートセンターをご覧ください。

公開日: 2018 年 2 月 13 日

更新 : 2018 年 7 月 24 日