Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

注册前 Lambda 触发器

注册前 Lambda 函数在 Amazon Cognito 注册新用户之前触发。它允许您执行自定义验证,以在注册过程中接受或拒绝注册请求。

注册前 Lambda 流程

客户端注册流程

 注册前 Lambda 触发器 - 客户端流程

服务器注册流程

 注册前 Lambda 触发器 - 服务器流程

该请求包含客户端中的数据,来自传递到用户池 SignUp 和 AdminCreateUser API 方法的 ValidationData 值。

注册前 Lambda 触发器参数

这些是此 Lambda 函数除常用参数以外还必需的参数。

JSON
JSON
{ "request": { "userAttributes": { "string": "string", .... }, "validationData": [ { "Name": "string", "Value": "string", } ... ], "response": { "autoConfirmUser": "boolean", "autoVerifyPhone": "boolean", "autoVerifyEmail": "boolean" } }

注册前请求参数

userAttributes

表示用户属性的一个或多个名称/值对。属性名称是键。

validationData

在用户注册请求中包含验证数据的一个或多个名称/值对。设置验证数据,然后在用户注册请求中从客户端传递。

注册前响应参数

在响应中,如果您想要自动确认用户,则您可以将 autoConfirmUser 设置为 true。您可以将 autoVerifyEmail 设置为 true,以自动验证用户的电子邮件。您可以将 autoVerifyPhone 设置为 true,以自动验证用户的电话号码。

autoConfirmUser

设置为 true 以自动确认用户,否则设置为 false

autoVerifyEmail

设置为 true 可以设置为所注册用户已通过验证的电子邮件,否则为 false。如果 autoVerifyEmail 设置为 true,则 email 属性必须具有有效的非空值。否则将出现错误,用户将无法完成注册。

如果选择 email 属性作为别名,则在设置了 autoVerifyEmail 时将为用户的电子邮件创建别名。如果已存在具有该电子邮件的别名,则别名将移动到新用户,以前用户的电子邮件将标记为未验证。有关更多信息,请参阅 别名概述

autoVerifyPhone

设置为 true 可以设置为所注册用户已通过验证的电话号码,否则为 false。如果 autoVerifyPhone 设置为 true,则 phone_number 属性必须具有有效的非空值。否则将出现错误,用户将无法完成注册。

如果选择 phone_number 属性作为别名,则在设置了 autoVerifyPhone 时将为用户的电话号码创建别名。如果已存在具有该电话号码的别名,则别名将移动到新用户,以前用户的电话号码将标记为未验证。有关更多信息,请参阅 别名概述

注册教程

注册前 Lambda 函数在用户注册前触发。请参阅这些适用于 JavaScript、Android 和 iOS 的 Amazon Cognito 注册教程。

平台 教程
JavaScript 身份开发工具包 通过 JavaScript 注册用户
Android 身份开发工具包 通过 Android 注册用户
iOS 身份开发工具包 通过 iOS 注册用户

注册前示例:从注册的域自动确认用户

使用注册前 Lambda 触发器,可以添加自定义逻辑来验证注册用户池的新用户。以下是示例 JavaScript 程序,演示如何注册新用户。它将在身份验证过程中调用注册前 Lambda 触发器。

JavaScript
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 自动确认来自特定电子邮件域的新用户。任何不在自定义域中的新用户都将添加到用户池,但不会自动确认。

Node.jsPython
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 函数。然后该函数将同一事件对象返回到 Amazon Cognito,同时在响应中返回任何更改。在 Lambda 控制台中,您可以使用与 Lambda 触发器相关的数据设置测试事件。下面是此代码示例的测试事件:

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

注册前示例:自动确认和自动验证所有用户

此示例确认所有用户并将用户的 emailphone_number 属性设置为“已验证”(如果该属性存在)。此外,如果启用了别名,当设置了自动验证时,将为 phone_numberemail 创建别名。

注意

如果已存在具有相同电话号码的别名,则别名将移动到新用户,以前用户的 phone_number 将标记为未验证。电子邮件地址也是如此。要防止出现这种情况,可以使用用户池 ListUsers API 查看现有用户是否已在使用新用户的电话号码或电子邮件地址作为别名。

Node.jsPython
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 函数。然后该函数将同一事件对象返回到 Amazon Cognito,同时在响应中返回任何更改。在 Lambda 控制台中,您可以使用与 Lambda 触发器相关的数据设置测试事件。下面是此代码示例的测试事件:

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