Amazon Cognito JSON ウェブトークンの署名をデコードして検証するにはどうすればよいですか?

最終更新日: 2020 年 9 月 14 日

アプリケーションの認証方法として Amazon Cognito ユーザープールを使用したいと考えています。クライアントからアプリケーションに送信された ID とアクセストークンを検証する安全な方法は何ですか?

簡単な説明

クライアントがユーザープールを使用してアプリケーションを認証すると、Amazon Cognito は ID トークンを送信します。次のようなシナリオでは、ID トークンを手動で検証できます。

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

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

解決方法

ユーザーがログインすると、Amazon Cognito ユーザープールは JWT を返します。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 をデコードして検証する方法のコード例については、「Amazon Cognito JWT トークンをデコードして検証する」を参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?