トークン生成前の Lambda トリガー
Amazon Cognito は、このトリガーをトークンの生成前に呼び出すため、ユーザープールトークンのクレームをカスタマイズできます。バージョン 1 または V1_0 のトークン生成前トリガーイベントの基本機能を使用して、アイデンティティ (ID) トークンをカスタマイズできます。エッセンシャル機能プランまたはプラス機能プランを使用するユーザープールでは、Machine to Machine (M2M) クライアント認証情報の付与で、アクセストークンのカスタマイズを伴うバージョン 2 (V2_0) トリガーイベントと、アクセストークンのカスタマイズを伴うバージョン 3 (V3_0) トリガーイベントを生成できます。
Amazon Cognito は、ID トークンに書き込むデータが含まれているリクエストとして V1_0 イベントを関数に送信します。V2_0 イベントまたは V3_0 イベントは、Amazon Cognito が ID トークンとアクセストークンの両方に書き込むデータが含まれている単一のリクエストです。両方のトークンをカスタマイズするには、トリガーバージョン 2 または 3 を使用するように関数を更新し、両方のトークンのデータを同じレスポンスで送信する必要があります。
Amazon Cognito は、バージョン 2 のイベントレスポンスを、ユーザー認証 (ユーザー自らユーザープールに提示した認証情報) からのアクセストークンに適用します。バージョン 3 のイベントレスポンスは、ユーザー認証とマシン認証からのアクセストークンに適用されます。マシン認証では、自動化されたシステムが、アプリケーションクライアントシークレットを使用してアクセストークンリクエストを承認します。結果のアクセストークンの状況を除いて、バージョン 2 と 3 のイベントは同じです。
この Lambda トリガーでは、Amazon Cognito がアプリケーションに発行する前の ID トークンとアクセストークンの一部のクレームを追加、削除、変更できます。この機能を使用するには、Amazon Cognito ユーザープールコンソールから Lambda 関数を関連付けるか、AWS Command Line Interface (AWS CLI) でユーザープール LambdaConfig を更新します。
イベントバージョン
ユーザープールは、トークン生成前トリガーイベントのさまざまなバージョンを Lambda 関数に配信できます。V1_0 トリガーは、ID トークンを変更するためのパラメータを配信します。V2_0 または V3_0 トリガーは、以下のパラメータを提供します。
-
V1_0トリガーの関数。 -
アクセストークンをカスタマイズする機能。
-
複雑なデータ型を ID に渡し、次のトークンクレーム値にアクセスする機能。
-
文字列
-
数値
-
ブール値
-
文字列、数値、ブール値、またはこれらの組み合わせの配列
-
JSON
-
注記
ID トークンでは、phone_number_verified、email_verified、updated_at および address を除くクレームの値に複雑なオブジェクトを入力できます。
ユーザープールはデフォルトで V1_0 イベントを配信します。V2_0 イベントを送信するようにユーザープールを設定するには、Amazon Cognito コンソールでトリガーを設定するときに、[トリガーイベントバージョン] として [基本機能 + ユーザー ID のアクセストークンのカスタマイズ] を選択します。V3_0 イベントを生成するには、[基本機能 + ユーザー ID とマシン ID のアクセストークンのカスタマイズ] を選択します。UpdateUserPool API リクエストまたは CreateUserPool API リクエストの LambdaConfig パラメータで LambdaVersion の値を設定することもできます。イベントバージョン 1、2、3 は、エッセンシャル機能プランとプラス機能プランで利用できます。バージョン 3 イベントの M2M オペレーションには、月間アクティブユーザー (MAU) の計算式とは別の料金体系があります。詳細については、「Amazon Cognito の料金
注記
ユーザープールが 2024 年 11 月 22 日 18:00 GMT 以前に [高度なセキュリティ機能] オプションを使用して動作し、ライト機能階層に残っている場合は、トークン生成前トリガーのイベントバージョン 1 と 2 にアクセスできます。このレガシー階層のユーザープールで高度なセキュリティ機能を有効にしていない場合は、イベントバージョン 1 にアクセスできます。バージョン 3 は、エッセンシャルとプラスでのみ利用できます。
クレームとスコープのリファレンス
Amazon Cognito は、アクセストークンと ID トークンに対して追加、変更、または抑制できるクレームとスコープを制限します。次の表は、Lambda 関数で変更できるクレームと変更できないクレーム、およびクレームの存在や値に影響するトリガーイベントパラメータを示しています。
| Claim | デフォルトのトークンタイプ | 追加可能? | 変更可能? | 抑制可能? | イベントパラメータ - 追加または変更 | イベントパラメータ - 抑制 | ID のタイプ | イベントバージョン |
|---|---|---|---|---|---|---|---|---|
| ユーザープールのトークンスキーマにないクレーム | なし | はい | あり | 該当なし | claimsToAddOrOverride |
claimsToSuppress |
ユーザー、マシン1 | すべて2 |
scope |
アクセス | はい | あり | あり | scopesToAdd |
scopesToSuppress |
ユーザー、マシン1 | v2_0, v3_0 |
cognito:groups |
ID、アクセス | はい | あり | あり | groupsToOverride |
claimsToSuppress |
ユーザー | すべて2 |
cognito:preferred_role |
ID | はい | あり | あり | preferredRole |
claimsToSuppress3 |
ユーザー | すべて |
cognito:roles |
ID | はい | あり | あり | iamRolesToOverride |
claimsToSuppress3 |
ユーザー | すべて |
cognito:username |
ID | なし | なし | いいえ | 該当なし | 該当なし | ユーザー | 該当なし |
cognito: プレフィックスが付いたその他のクレーム |
なし | なし | なし | いいえ | 該当なし | 該当なし | 該当なし | 該当なし |
username |
アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー | v2_0, v3_0 |
sub |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー | 該当なし |
| 標準 OIDC 属性 | ID | はい | あり | あり | claimsToAddOrOverride |
claimsToSuppress |
ユーザー | すべて |
custom: 属性 |
ID | はい | あり | あり | claimsToAddOrOverride |
claimsToSuppress |
ユーザー | すべて |
dev: 属性 |
ID | なし | なし | あり | 該当なし | claimsToSuppress |
ユーザー | すべて |
identities |
ID | なし | なし | いいえ | 該当なし | 該当なし | ユーザー | 該当なし |
aud4 |
ID | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
client_id |
アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
event_id |
アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
device_key |
アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー | 該当なし |
version |
アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
acr |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
amr |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
at_hash |
ID | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
auth_time |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
azp |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
exp |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
iat |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
iss |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
jti |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
nbf |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
nonce |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
origin_jti |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
token_use |
ID、アクセス | なし | なし | いいえ | 該当なし | 該当なし | ユーザー、マシン | 該当なし |
1 マシン ID のアクセストークンは、トリガー入力イベントの v3_0 でのみ使用できます。イベントバージョン 3 は、エッセンシャル機能階層とプラス機能階層でのみ使用できます。ライト階層のユーザープールは v1_0 イベントを受信できます。高度なセキュリティ機能を備えた、ライト階層のユーザープールは、v1_0 イベントと v2_0 イベントを受信できます。
2 トークン生成前トリガーを、v1_0 イベントバージョン (ID トークンのみ)、v2_0 イベントバージョン (ID トークンとアクセストークン)、v3_0 イベントバージョン ( ID トークンとアクセストークン、さらにマシン ID の機能) に設定します。
3 cognito:preferred_role クレームと cognito:roles クレームを抑制するには、cognito:groups を claimsToSuppress に追加します。
4 aud クレームをアクセストークンに追加することはできますが、その値は現在のセッションのアプリケーションクライアント ID と一致する必要があります。リクエストイベントのクライアント ID は、event.callerContext.clientId から取得できます。
ID トークンのカスタマイズ
トークン生成前 Lambda トリガーのすべてのイベントバージョンでは、ユーザープールのアイデンティティ (ID) トークンの内容をカスタマイズできます。ID トークンは、ウェブまたはモバイルアプリにサインインするためのユーザー属性を、信頼できる ID ソースから提供します。ID トークンの詳細については、「ID トークンの理解」を参照してください。
トークン生成前の Lambda トリガーでは、ID トークンを使用して以下のような操作を行います。
-
ユーザーがアイデンティティプールにリクエストした IAM ロールをランタイムに変更します。
-
外部ソースからユーザー属性を追加します。
-
既存のユーザー属性値を追加または置換します。
-
アプリに渡されるはずのユーザー属性が、ユーザーの許可されたスコープや、アプリクライアントに付与した属性の読み取りアクセス権により開示されることを抑制します。
アクセストークンのカスタマイズ
トークン生成前 Lambda トリガーのイベントバージョン 2 および 3 を使用すると、ユーザープールのアクセストークンの内容をカスタマイズできます。アクセストークンは、Amazon Cognito トークン認可 API オペレーションやサードパーティ API などのアクセス保護されたリソースから情報を取得することをユーザーに許可します。クライアント認証情報の付与による Machine to Machine (M2M) 認証の場合、Amazon Cognito は、ユーザープールがバージョン 3 (V3_0) イベント用に設定されている場合にのみ、トークン生成前トリガーを呼び出します。アクセストークンの詳細については、「アクセストークンの理解」を参照してください。
トークン生成前の Lambda トリガーでは、アクセストークンを使用して以下のような操作を行います。
-
scopeクレーム内のスコープを追加または抑制します。例えば、スコープaws.cognito.signin.user.adminのみを割り当てる Amazon Cognito ユーザープール API 認証で生成されたアクセストークンにスコープを追加できます。 -
ユーザープールグループのユーザーのメンバーシップを変更します。
-
Amazon Cognito アクセストークンにまだ存在していないクレームを追加します。
-
アプリに渡されるはずのクレームの開示を抑制します。
ユーザープールでのアクセスのカスタマイズをサポートするには、トリガーリクエストの更新バージョンを生成するようにユーザープールを設定する必要があります。ユーザープールを更新するには、次の手順に従います。
Machine to Machine (M2M) クライアント認証情報のクライアントメタデータ
クライアントメタデータは M2M リクエストで渡すことができます。クライアントメタデータは、トークン生成前の Lambda トリガー の結果に役立つユーザーまたはアプリケーション環境からの追加情報です。ユーザープリンシパルによる認証オペレーションでは、AdminRespondToAuthChallenge API リクエストおよび RespondToAuthChallenge API リクエストの本文で、クライアントメタデータをトークン生成前トリガーに渡すことができます。アプリケーションは、トークンエンドポイントへの直接リクエストを使用して M2M のアクセストークン生成フローを実行するため、異なるモデルとなります。クライアント認証情報のトークンリクエストの POST 本文で、クライアントメタデータオブジェクトを URL エンコード (x-www-form-urlencoded) した aws_client_metadata パラメータを文字列に渡します。リクエスト例については、「基本認可によるクライアント認証情報」を参照してください。次に示すのは、キーと値のペア {"environment": "dev", "language": "en-US"} を渡すパラメータの例です。
aws_client_metadata=%7B%22environment%22%3A%20%22dev%22,%20%22language%22%3A%20%22en-US%22%7D
トピック
トークン生成前の Lambda トリガーのソース
| triggerSource 値 | イベント |
|---|---|
TokenGeneration_HostedAuth |
Amazon Cognito マネージドログインのサインインページからの認証時に呼び出されます。 |
TokenGeneration_Authentication |
ユーザー認証フローが完了した後に呼び出されます。 |
TokenGeneration_NewPasswordChallenge |
管理者によってユーザーが作成された後に呼び出されます。このフローは、ユーザーが一時パスワードを変更する必要があるときに呼び出されます。 |
TokenGeneration_ClientCredentials |
M2M クライアント認証情報の付与の後に呼び出されます。ユーザープールがこのイベントを送信するのは、イベントバージョンが V3_0 の場合のみです。 |
TokenGeneration_AuthenticateDevice |
ユーザーデバイスの認証の終了時に呼び出されます。 |
TokenGeneration_RefreshTokens |
ユーザーが ID およびアクセスのトークンを更新しようとしたときに呼び出されます。 |
トークン生成前の Lambda トリガーのパラメータ
Amazon Cognito がこの Lambda 関数に渡すリクエストは、以下のパラメータと Amazon Cognito がすべてのリクエストに追加する共通パラメータを組み合わせたものです。トークン生成前の Lambda トリガーをユーザープールに追加するときに、トリガーバージョンを選択できます。このバージョンにより、Amazon Cognito がアクセストークンをカスタマイズするための追加パラメータを含むリクエストを Lambda 関数に渡すかどうかが決まります。
トークン生成前のリクエストパラメータ
| 名前 | 説明 | トリガーイベントの最小バージョン |
|---|---|---|
| userAttributes |
ユーザープール内のユーザープロファイルの属性。 |
1 |
| groupConfiguration |
現在のグループ設定を含む入力オブジェクト。このオブジェクトには、 |
1 |
| groupsToOverride |
ユーザーがメンバーになっているユーザープールグループ。 |
1 |
| iamRolesToOverride |
ユーザープールグループを AWS Identity and Access Management (IAM) ロールに関連付けることができます。この要素は、ユーザーがメンバーになっているグループのすべての IAM ロールのリストです。 |
1 |
| preferredRole |
ユーザープールグループには、優先順位を設定できます。この要素には、 |
1 |
| clientMetadata |
トークン生成前のトリガーに指定する Lambda 関数へのカスタム入力として提供できる 1 つ、または複数のキー/値ペア。 このデータを Lambda 関数に渡すには、AdminRespondToAuthChallenge および RespondToAuthChallenge API オペレーションで ClientMetadata パラメータを使用します。Amazon Cognito は、トークン生成前の関数に渡すリクエストの AdminInitiateAuth および InitiateAuth API オペレーションに |
1 |
| scopes |
アクセストークンのスコープ。アクセストークンに含まれるスコープは、ユーザーがリクエストし、アプリクライアントに発行を許可したユーザープールの標準スコープとカスタムスコープです。 |
2 |
トークン生成前のレスポンスパラメータ
| 名前 | 説明 | トリガーイベントの最小バージョン |
|---|---|---|
| claimsOverrideDetails | A container for all elements in a V1_0 trigger event. |
1 |
| claimsAndScopeOverrideDetails |
|
2 |
| idTokenGeneration |
ユーザーの ID トークンで上書き、追加、または抑制するクレーム。この ID トークンのカスタマイズ値の親は、バージョン 2 以降でのみ表示されますが、子要素はバージョン 1 のイベントでも表示されます。 |
2 |
| accessTokenGeneration |
ユーザーのアクセストークンで上書き、追加、または抑制するクレームとスコープ。このアクセストークンのカスタマイズ値の親は、バージョン 2 以降のイベントでのみ表示されます。 |
2 |
| claimsToAddOrOverride |
追加または変更する 1 つ以上のクレームとその値のマップ。グループ関連のクレームには、代わりに イベントバージョン 2 以降の場合、この要素は |
1* |
| claimsToSuppress |
Amazon Cognito で抑制するクレームのリスト。関数がクレーム値の非表示と置換の両方を行う場合、Amazon Cognito はクレームを非表示にします。 イベントバージョン 2 以降の場合、この要素は |
1 |
| groupOverrideDetails |
現在のグループ設定を含む出力オブジェクト。このオブジェクトには、 この関数は、 Amazon Cognito ID とアクセストークンには、両方とも |
1 |
| scopesToAdd |
ユーザーのアクセストークンの |
2 |
| scopesToSuppress |
ユーザーのアクセストークンの |
2 |
* バージョン 1 のイベントへのレスポンスオブジェクトは、文字列を返すことができます。バージョン 2 および 3 のイベントへのレスポンスオブジェクトは、複雑なオブジェクトを返すことができます。
トークン生成前トリガーイベントバージョン 2 の例:クレーム、スコープ、グループの追加と非表示
この例では、ユーザーのトークンに以下の変更を行います。
-
ID トークンに
family_nameとしてDoeを設定します。 -
ID トークンに
emailクレームとphone_numberクレームが表示されないようにします。 -
ID トークンの
cognito:rolesクレームを"arn:aws:iam::123456789012:role\/sns_callerA","arn:aws:iam::123456789012:role\/sns_callerC","arn:aws:iam::123456789012:role\/sns_callerB"に設定します。 -
ID トークンの
cognito:preferred_roleクレームをarn:aws:iam::123456789012:role/sns_callerに設定します。 -
スコープとして
openid、email、solar-system-data/asteroids.addをアクセストークンに追加します。 -
アクセストークンの
phone_numberスコープとaws.cognito.signin.user.adminスコープを非表示にします。phone_numberを削除すると、userInfoからユーザーの電話番号が取得されなくなります。aws.cognito.signin.user.adminを削除すると、ユーザーが Amazon Cognito ユーザープール API を使用して自分のプロファイルを読み取ったり変更したりするための API リクエストが禁止されます。注記
phone_numberをスコープから削除した場合、アクセストークンの残りのスコープにopenidと少なくとも 1 つの標準スコープが含まれていれば、ユーザーの電話番号のみが取得できなくなります。詳細については、「スコープについて」を参照してください。 -
ID トークンとアクセストークンの
cognito:groupsクレームを"new-group-A","new-group-B","new-group-C"に設定します。
Amazon Cognito は Lambda 関数にイベント情報を渡します。関数はレスポンスで、同じイベントオブジェクトを変更と共に Amazon Cognito に返します。Lambda コンソールで、Lambda トリガーに関連するデータを使用したテストイベントをセットアップできます。以下は、このコードサンプルのテストイベントです。
トークン生成前イベントバージョン 2 の例: 複雑なオブジェクトでクレームを追加する
この例では、ユーザーのトークンに以下の変更を行います。
-
ID トークンに数値、文字列、ブール値、JSON タイプのクレームを追加します。これは、ID トークンでバージョン 2 のトリガーイベントが利用できる唯一の変更です。
-
アクセストークンに数値、文字列、ブール値、JSON タイプのクレームを追加します。
-
アクセストークンに 3 つのスコープを追加します。
-
ID トークンとアクセストークンの
emailクレームを抑制します。 -
アクセストークンの
aws.cognito.signin.user.adminスコープを抑制します。
Amazon Cognito は Lambda 関数にイベント情報を渡します。関数はレスポンスで、同じイベントオブジェクトを変更と共に Amazon Cognito に返します。Lambda コンソールで、Lambda トリガーに関連するデータを使用したテストイベントをセットアップできます。以下は、このコードサンプルのテストイベントです。
トークン生成前イベントバージョン 1 の例: 新しいクレームの追加と既存のクレームの非表示
この例では、トークン生成前の Lambda 関数でバージョン 1 のトリガーイベントを使用して、新しいクレームを追加し、既存のクレームを抑制します。
Amazon Cognito は Lambda 関数にイベント情報を渡します。関数はレスポンスで、同じイベントオブジェクトを変更と共に Amazon Cognito に返します。Lambda コンソールで、Lambda トリガーに関連するデータを使用したテストイベントをセットアップできます。以下は、このコードサンプルのテストイベントです。コード例 ではリクエストパラメータを処理しないため、空のリクエストでテストイベントを使用できます。共通のリクエストパラメータの詳細については、「ユーザープールの Lambda トリガーイベント」を参照してください。
トークン生成前イベントバージョン 1 の例: ユーザーグループのメンバーシップの変更
この例では、トークン生成前の Lambda 関数でバージョン 1 のトリガーイベントを使用し、ユーザーのグループメンバーシップを変更します。
Amazon Cognito は Lambda 関数にイベント情報を渡します。関数はレスポンスで、同じイベントオブジェクトを変更と共に Amazon Cognito に返します。Lambda コンソールで、Lambda トリガーに関連するデータを使用したテストイベントをセットアップできます。以下は、このコードサンプルのテストイベントです。