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 ユーザープールで定義されたユーザーフィールドが含まれています。

JWT トークンには、ヘッダー、ペイロード、および署名という、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 キーを生成します。シークレットキーのうち片方はトークンに署名するために使用されます。対応するパブリックキーは、次の形式のアドレス内に示されていて、利用可能になっています。

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

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 の署名を確認するには、まず JWT のキー ID にマッチするキー ID を持つキーを検索します。それから、ライブラリを使用してトークンをデコードし、署名を確認します。次の点も確認してください。

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

この解決法はほとんどのアプリケーションに適しています。この解決方法で AWS Lambda を使用する方法については、GitHub ウェブサイトの「Decode and verify Amazon Cognito JWT tokens (Amazon Cognito JWT トークンのデコードと確認)」を参照してください。


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

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

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

公開日: 2018 年 2 月 13 日