Go语言中Cognito CustomMessage_ForgotPassword事件UserAttributes为空问题
解决方案
核心问题
你遇到的%!s()错误是因为两个关键问题:
- Cognito用户属性的键为小写的
email,而非你代码中使用的大写开头Email,导致无法获取到属性值; 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
相关产品推荐
相关产品推荐

