【问题标题】:Cognito Custom message trigger to redirect to referer URLCognito 自定义消息触发器以重定向到引用 URL
【发布时间】:2018-05-30 01:05:39
【问题描述】:

我使用同一个 Cognito 用户池处理来自多个域的站点的项目。我为验证配置了一个自定义消息触发器并忘记了密码电子邮件,我需要在消息正文上放置一个链接,将用户重定向到发送请求的域。有没有办法获取请求的referer?

【问题讨论】:

  • 您可以设置 website 用户属性。我用它来向自定义消息触发器指示如何正确格式化验证链接。

标签: java aws-lambda amazon-cognito


【解决方案1】:

我不这么认为。根据this docs,自定义消息 lambda 触发器使用事件对象和事件对象获取这些信息,我的测试是这样的:

{
    "version": "1",
    "region": "us-east-1",
    "userPoolId": "us-east-1_xxxxxxxx",
    "userName": "myuser",
    "callerContext": {
        "awsSdkVersion": "aws-sdk-unknown-unknown",
        "clientId": "xxxxxxxxxxxxxxxxxxxxxxxx"
    },
    "triggerSource": "CustomMessage_ForgotPassword",
    "request": {
        "userAttributes": {
            "sub": "xxxxxxxx-xxxx-xxxx-ad88-da626e7b6496",
            "email_verified": "true",
            "cognito:user_status": "CONFIRMED",
            "nickname": "nick",
            "name": "myname",
            "email": "email@example.com"
        },
        "codeParameter": "{####}",
        "usernameParameter": null
    },
    "response": {
        "smsMessage": null,
        "emailMessage": null,
        "emailSubject": null
    }
}

唯一(稍微)相关的信息是 callerContext,但它的值取决于调用 ForgotPassword API 的方法。尝试对此进行测试并将事件对象记录在您的 SignUp lambda 中并查看您是否获得了一些信息(我认为您不能)。

【讨论】:

    【解决方案2】:

    为什么不添加一个声明来表明请求来自哪个域。

    或者在 cognito 中为每个域创建一个客户端。

    .. 我更喜欢索赔方法,感觉如果再往下走会是一个有用的索赔。

    【讨论】:

      【解决方案3】:

      在忘记密码请求时,从APIGatewayProxyRequestEvent 的标头中获取引用者:有一个标头referer。在创建ForgotPasswordRequest 时,将此引用设置为clientMetadata

      public void resetPassword(String email, String referer) {
          var forgotPasswordRequest = ForgotPasswordRequest.builder()
                  .username(email)
                  .clientId(COGNITO_USERS_POOL_APP_CLIENT_ID)
                  .secretHash(calculateSecretHash(email))
                  .clientMetadata(Map.of("referer", referer))
                  .build();
          cognitoIdentityProviderClient.forgotPassword(forgotPasswordRequest);
      }
      

      然后在您的触发器处理程序中,只需检索此引用:

        public Object handleRequest(Object event, Context context) {
            JsonObject json = gson.toJsonTree(event).getAsJsonObject();
            if ("CustomMessage_ForgotPassword".equals(json.get("triggerSource").getAsString())) {
              var request = json.get("request").getAsJsonObject();
              var clientMetadata = request.get("clientMetadata").getAsJsonObject();
              var referer = clientMetadata.get("referer").getAsString();
              
              // retrieve "codeParameter" and "email"
              // create message
              // set response "emailMessage", "emailSubject" and "smsMessage"  
      
              event = gson.fromJson(json, LinkedHashMap.class);
          }
          return event;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        • 2019-08-07
        • 2019-11-13
        • 1970-01-01
        • 2020-12-28
        相关资源
        最近更新 更多