サインアップ前の Lambda トリガー - Amazon Cognito

サインアップ前の Lambda トリガー

サインアップ前の Lambda 関数は、Amazon Cognito が新しいユーザーをサインアップする直前にトリガーされます。これにより、サインアップのプロセスの一環としてカスタム検証を行い、登録リクエストを承認または拒否できます。

サインアップ前の Lambda フロー

クライアントのサインアップフロー


                    サインアップ前の Lambda トリガー - クライアントフロー

サーバーのサインアップフロー


                    サインアップ前の Lambda トリガー - サーバーフロー

リクエストには、クライアントからの検証データが含まれています。このデータは、ユーザープールの SignUp と AdminCreateUser の API メソッドに渡された ValidationData 値に基づきます。

サインアップ前の Lambda トリガーのパラメータ

これらは、一般的なパラメータに加えて、この Lambda 関数で必要となるパラメータです。

JSON
{ "request": { "userAttributes": { "string": "string", . . . }, "validationData": { "string": "string", . . . }, "clientMetadata": { "string": "string", . . . } }, "response": { "autoConfirmUser": "boolean", "autoVerifyPhone": "boolean", "autoVerifyEmail": "boolean" } }

サインアップ前のリクエストパラメータ

userAttributes

ユーザー属性を表す 1 つ以上の名前 - 値ペア。属性名はキーです。

validationData

ユーザー登録リクエストに検証データを含む 1 つ以上の名前 - 値ペア。検証データは設定されてからユーザー登録リクエストでクライアントから渡されます。このデータは、InitiateAuth および AdminInitiateAuth API アクションで ClientMetadata パラメータを使用することによって Lambda 関数に渡すことができます。

clientMetadata

サインアップ前のトリガーに指定する Lambda 関数へのカスタム入力として提供できる 1 つ、または複数のキー/値ペア。このデータは、AdminCreateUserAdminRespondToAuthChallengeForgotPassword、および SignUp の各 API アクションで ClientMetadata パラメータを使用することによって Lambda 関数に渡すことができます。

サインアップ前のレスポンスパラメータ

ユーザーを自動的に確認する場合は、レスポンスで autoConfirmUsertrue に設定できます。autoVerifyEmailtrue に設定してユーザーの E メールを自動検証できます。autoVerifyPhonetrue に設定してユーザーの電話番号を自動検証できます。

注記

レスポンスパラメータの autoVerifyPhoneautoVerifyEmail、および autoConfirmUser は、サインアップ前の Lambda が AdminCreateUser API によってトリガーされる場合、Amazon Cognito によって無視されます。

autoConfirmUser

ユーザーを自動的に確認する場合は true に、それ以外の場合は false に設定します。

autoVerifyEmail

true に設定すると、サインアップしたユーザーの E メールを検証済みとして設定します。それ以外の場合は false です。autoVerifyEmailtrue に設定されている場合、email 属性は有効な null 以外の値である必要があります。それ以外の場合はエラーが発生し、ユーザーがサインアップを完了できません。

email 属性がエイリアスとして選択されている場合、autoVerifyEmail が設定されていると、ユーザーの E メールのエイリアスが自動的に作成されます。その E メールのエイリアスが既に存在している場合は、エイリアスは新規ユーザーに移動され、以前のユーザーの E メールは未検証としてマークされます。詳細については、「エイリアスの概要」を参照してください。

autoVerifyPhone

true に設定すると、サインアップしたユーザーの電話番号を検証済みとして設定します。それ以外の場合は false です。autoVerifyPhonetrue に設定されている場合、phone_number 属性は有効な null 以外の値である必要があります。それ以外の場合はエラーが発生し、ユーザーがサインアップを完了できません。

phone_number 属性がエイリアスとして選択されている場合、autoVerifyPhone が設定されていると、ユーザーの電話番号のエイリアスが自動的に作成されます。その電話番号のエイリアスが既に存在している場合、エイリアスは新規ユーザーに移動され、以前のユーザーの電話番号は未検証としてマークされます。詳細については、「エイリアスの概要」を参照してください。

サインアップチュートリアル

サインアップ前の Lambda 関数は、ユーザーのサインアップ前にトリガーされます。JavaScript、Android、および iOS に関する以下の Amazon Cognito サインアップチュートリアルを参照してください。

プラットフォーム チュートリアル
JavaScript ID SDK JavaScript でのユーザーのサインアップ
Android ID SDK Android でのユーザーのサインアップ
iOS ID SDK iOS でのユーザーのサインアップ

サインアップ前の例: 登録済みドメインのユーザーを自動確認する

サインアップ前の Lambda トリガーを使用して、ユーザープールにサインアップする新しいユーザーを検証するためのカスタムロジックを追加できます。これは、新しいユーザーにサインアップする方法を示すサンプルの JavaScript プログラムです。これは認証の一環としてサインアップ前の Lambda トリガーを呼び出します。

JavaScript
var attributeList = []; var dataEmail = { Name : 'email', Value : '...' // your email here }; var dataPhoneNumber = { Name : 'phone_number', Value : '...' // your phone number here with +country code and no delimiters in front }; var dataEmailDomain = { Name: "custom:domain", Value: "example.com" } var attributeEmail = new AmazonCognitoIdentity.CognitoUserAttribute(dataEmail); var attributePhoneNumber = new AmazonCognitoIdentity.CognitoUserAttribute(dataPhoneNumber); var attributeEmailDomain = new AmazonCognitoIdentity.CognitoUserAttribute(dataEmailDomain); attributeList.push(attributeEmail); attributeList.push(attributePhoneNumber); attributeList.push(attributeEmailDomain); var cognitoUser; userPool.signUp('username', 'password', attributeList, null, function(err, result){ if (err) { alert(err); return; } cognitoUser = result.user; console.log('user name is ' + cognitoUser.getUsername()); });

以下は、ユーザープールサインアップ前の Lambda トリガーを使用してサインアップ直前に呼び出されるサンプル Lambda トリガーです。これは、カスタム属性の [custom:domain] を使用して特定の E メールドメインからの新しいユーザーを自動的に確認します。このカスタムドメインに属していない新しいユーザーは、ユーザープールには追加されますが、自動的には確認されません。

Node.js
exports.handler = (event, context, callback) => { // Set the user pool autoConfirmUser flag after validating the email domain event.response.autoConfirmUser = false; // Split the email address so we can compare domains var address = event.request.userAttributes.email.split("@") // This example uses a custom attribute "custom:domain" if (event.request.userAttributes.hasOwnProperty("custom:domain")) { if ( event.request.userAttributes['custom:domain'] === address[1]) { event.response.autoConfirmUser = true; } } // Return to Amazon Cognito callback(null, event); };
Python
def lambda_handler(event, context): # It sets the user pool autoConfirmUser flag after validating the email domain event['response']['autoConfirmUser'] = False # Split the email address so we can compare domains address = event['request']['userAttributes']['email'].split('@') # This example uses a custom attribute 'custom:domain' if 'custom:domain' in event['request']['userAttributes']: if event['request']['userAttributes']['custom:domain'] == address[1]: event['response']['autoConfirmUser'] = True # Return to Amazon Cognito return event

Amazon Cognito は Lambda 関数にイベント情報を渡します。Lambda 関数はレスポンスで、同じイベントオブジェクトを変更と共に Amazon Cognito に返します。Lambda コンソールで、Lambda トリガーに関連するデータを使用したテストイベントをセットアップできます。以下は、このコードサンプルのテストイベントです。

JSON
{ "request": { "userAttributes": { "email": "testuser@example.com", "custom:domain": "example.com" } }, "response": {} }

サインアップ前の例: すべてのユーザーを自動確認して自動検証する

次の例では、すべてのユーザーを確認し、ユーザーの email 属性と phone_number 属性を検証済みとして設定します (属性が存在する場合)。また、エイリアシングが有効になっている場合は、自動検証が設定されていると、phone_number および email にエイリアスが作成されます。

注記

同じ電話番号のエイリアスが既に存在している場合は、エイリアスは新規ユーザーに移動され、以前のユーザーの phone_number は未検証としてマークされます。E メールアドレスの場合も同様です。これを防ぐには、ユーザープール ListUsers API を使用して既存のユーザーの中に、新しいユーザーの電話番号や E メールアドレスをエイリアスとして既に使用しているユーザーがいないかどうかを確認します。

Node.js
exports.handler = (event, context, callback) => { // Confirm the user event.response.autoConfirmUser = true; // Set the email as verified if it is in the request if (event.request.userAttributes.hasOwnProperty("email")) { event.response.autoVerifyEmail = true; } // Set the phone number as verified if it is in the request if (event.request.userAttributes.hasOwnProperty("phone_number")) { event.response.autoVerifyPhone = true; } // Return to Amazon Cognito callback(null, event); };
Python
def lambda_handler(event, context): # Confirm the user event['response']['autoConfirmUser'] = True # Set the email as verified if it is in the request if 'email' in event['request']['userAttributes']: event['response']['autoVerifyEmail'] = True # Set the phone number as verified if it is in the request if 'phone_number' in event['request']['userAttributes']: event['response']['autoVerifyPhone'] = True # Return to Amazon Cognito return event

Amazon Cognito は Lambda 関数にイベント情報を渡します。Lambda 関数はレスポンスで、同じイベントオブジェクトを変更と共に Amazon Cognito に返します。Lambda コンソールで、Lambda トリガーに関連するデータを使用したテストイベントをセットアップできます。以下は、このコードサンプルのテストイベントです。

JSON
{ "request": { "userAttributes": { "email": "user@example.com", "phone_number": "+12065550100" } }, "response": {} }