我正在开发一个基于 Java 的 AWS Cognito Pre-Sign-up Lambda 触发器来自动确认用户并将他们的电子邮件设置为已验证。
根据AWS 文档,“Amazon Cognito 将事件信息传递给您的 Lambda 函数。然后该函数将相同的事件对象返回给 Amazon Cognito,并在响应中进行任何更改。” 我看过有关如何在注册前 Lambda 响应中使用“autoConfirmUser”和“autoVerifyEmail”的文档(以及大量 StackOverflow 讨论);甚至为 Node.js 和 Python 提供了示例。
虽然在 Java 中做类似的事情似乎很简单,但我显然没有返回预期的响应,并且我的用户是在没有自动确认和电子邮件验证的情况下创建的。
在我的 Cognito 用户池上注册并设置为注册前触发器后,我可以看到每次创建用户时都会调用我的 Lambda(例如通过管理控制台使用“创建用户”)。记录进入 Lambda 的请求,请求是:
{
version = 1, region = us - east - 1, userPoolId = us - east - 1_1 IhOKuyug, userName = user@test.com, callerContext = {
awsSdkVersion = aws - sdk - unknown - unknown,
clientId = CLIENT_ID_NOT_APPLICABLE
}, triggerSource = PreSignUp_AdminCreateUser, request = {
userAttributes = {
phone_number = +15555555555,
email = user@test.com
},
validationData = null
}, response = {
autoConfirmUser = false,
autoVerifyEmail = false,
autoVerifyPhone = false
}
}
我的 Lambda 是:
public class PreSignUpRequestHandler implements RequestHandler {
@Override
public Object handleRequest(Object requestObject, Context context) {
Map requestObjectMap = (Map) requestObject;
Map<String, Object> responseData = (Map) requestObjectMap.get("response");
responseData.put("autoConfirmUser", true);
responseData.put("autoVerifyEmail", true);
responseData.put("autoVerifyPhone", false);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String jsonResponse = gson.toJson(requestObject);
context.getLogger().log("Response JSON: " + jsonResponse);
return requestObject;
}
}
使用 AWS Cognito 常规设置 > 用户和组 > 创建用户,用户已创建,但账户状态列为“FORCE_CHANGE_PASSWORD”,验证的电子邮件列为“-”。在将 Lambda 表达式分配为通过确认/验证过程的触发器之前创建的用户的帐户状态列为“已确认”,并且电子邮件已验证列为“真”。
查看 CloudWatch,上面的 Lambda 产生了:
Response JSON:
{
"version": "1",
"region": "us-east-1",
"userPoolId": "us-east-1_1IhOKuyRR",
"userName": "user@test.com",
"callerContext": {
"awsSdkVersion": "aws-sdk-unknown-unknown",
"clientId": "CLIENT_ID_NOT_APPLICABLE"
},
"triggerSource": "PreSignUp_AdminCreateUser",
"request": {
"userAttributes": {
"phone_number": "+5555555555",
"email": "user@test.com"
}
},
"response": {
"autoConfirmUser": true,
"autoVerifyEmail": true,
"autoVerifyPhone": false
}
}
显然,创建了用户并解雇了 Lambda。然而,尽管 Lambda 将“autoConfirmUser”和“autoVerifyEmail”都返回为 true,但在创建用户时并未应用这些响应设置。
我错过了什么,我做错了什么?