1

我正在开发一个基于 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,但在创建用户时并未应用这些响应设置。

我错过了什么,我做错了什么?

4

1 回答 1

0

我能够解决我的问题。

上面的代码示例正常工作,没有任何更改。

对于遇到此问题的其他人(包括我未来的自己),关键信息位于文档中的注释中:

NOTE:
Response parameters autoVerifyPhone, autoVerifyEmail and autoConfirmUser are ignored by Amazon Cognito when the Pre Sign-up lambda is triggered by the AdminCreateUser API.

由于我之前的所有测试都是在管理控制台中执行的,因此在阅读本文后,我意识到我应该从我的应用程序中执行测试。果然,当从应用程序进行测试时,Lambda 无需修改即可按预期工作。

总而言之,在开发 Cognito Pre-Sign-up Lambda 触发器时,触发器在从 AWS 管理控制台 UI 执行时不会产生所需的结果(即:用户通过已验证的电子邮件确认),但在从您的应用程序执行时会产生。

于 2022-02-04T18:08:35.423 回答