You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中Cognito CustomMessage_ForgotPassword事件UserAttributes为空问题

解决方案

核心问题

你遇到的%!s()错误是因为两个关键问题:

  1. Cognito用户属性的键为小写的email,而非你代码中使用的大写开头Email,导致无法获取到属性值;
  2. UserAttributes是map[string]interface{}类型,直接用%s格式化未做类型断言的interface{}值,会在值为nil时触发格式错误。

修复步骤及代码示例

1. 修正属性键并处理类型断言

将属性键改为小写email,同时添加类型断言和 fallback 逻辑,避免属性不存在或类型错误的情况:

func handler(ctx context.Context, event *events.CognitoEventUserPoolsCustomMessage) (*events.CognitoEventUserPoolsCustomMessage, error) {
    resetURL := fmt.Sprintf("%s/login/recover", os.Getenv("DOMAIN_URL"))
    
    // 正确获取并处理Email属性
    email := ""
    attr, exists := event.Request.UserAttributes["email"]
    if exists {
        // 断言为string类型,失败则使用UsernameParameter作为 fallback
        var ok bool
        email, ok = attr.(string)
        if !ok {
            email = event.Request.UsernameParameter
        }
    } else {
        // 属性不存在时, fallback到UsernameParameter(若用户池用Email作用户名则等效)
        email = event.Request.UsernameParameter
    }

    customMessageForgotPassword := fmt.Sprintf(
        `<style>
        p {
        display: block;
        }
        </style>

        <div tabindex="-1"><p>Hello,</p>
        <p> Click on link below to reset your password.</p>
        <p><a href="%s?code=%s&email=%s"> Reset Password </a></p>
        <p>Thanks</p>
        </div>`,
        resetURL,
        event.Request.CodeParameter, email)

    if event.TriggerSource == "CustomMessage_ForgotPassword" {
        event.Response.EmailMessage = customMessageForgotPassword
        event.Response.EmailSubject = "Reset Your Password"
    }

    return event, nil
}

2. 验证用户池配置

确保以下配置正确:

  • 进入AWS Cognito用户池,在属性页面确认Email是已启用的用户属性,且用户注册时已填写有效值;
  • 在触发器页面确认CustomMessage触发器已关联你的Lambda函数,且触发事件包含ForgotPassword;
  • 检查目标用户的详情页,确认Email属性存在且不为空。

内容的提问来源于stack exchange,提问作者vishal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:35:27