Cognito自定义消息触发器重定向到referer URL

时间:2017-12-15 19:30:57

标签: java aws-lambda amazon-cognito

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

3 个答案:

答案 0 :(得分:0)

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

{
    "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&中记录事件对象看看你是否得到了一些信息(我不认为你可以)。

答案 1 :(得分:0)

在我的脑海中,为什么不添加一个声明来指示请求来自哪个域。

或者在每个域的Cognito中创建一个客户端。

..我更喜欢索赔方式,感觉它是一个有用的声明,可以进一步发展。

答案 2 :(得分:0)

在忘记密码请求时,从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;
}