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

如何让AWS Cognito验证邮件显示发送后24小时的过期时间?

问题根源

你当前定义的date和time变量是在CDK部署阶段计算的,值会被直接固化到CloudFormation模板中,所以所有用户收到的邮件里,过期时间都是部署时刻加24小时的固定值,而非邮件实际发送时的时间点加24小时。

解决方案

方法1:用Cognito内置变量(最简单)

AWS Cognito的自定义邮件模板自带验证码过期时间的内置变量,无需手动计算,直接替换模板内容即可:

  • {expiration-date}:自动填充验证码过期的日期(格式随用户所在区域自动适配)
  • {expiration-time}:自动填充验证码过期的时间

修改CDK中Cognito用户池的邮件模板配置,移除之前的自定义变量,改用内置变量:

const userPool = new cognito.UserPool(this, 'MyUserPool', {
  // 其他用户池配置...
  verificationMessageTemplate: {
    emailSubject: '你的账户验证邮件',
    emailBody: `请使用验证码 {####} 完成账户验证
该验证码将在 {expiration-date} {expiration-time} 过期`,
    // 如需短信模板,同样可以用这两个变量
    smsMessage: '你的账户验证码是 {####},将在 {expiration-date} {expiration-time} 过期'
  }
});

方法2:用Lambda触发器自定义格式(灵活性更高)

如果需要自定义日期时间的显示格式(比如指定为YYYY-MM-DD HH:mm),可以通过Cognito的Custom Message触发器,在邮件发送时实时计算过期时间。

步骤1:编写Lambda函数

创建一个Lambda函数,在触发时计算当前时间+24小时的格式化时间,替换邮件内容:

// custom-message-trigger.ts
export const handler = async (event: any) => {
  // 仅处理注册验证邮件的触发场景
  if (event.triggerSource === 'CustomMessage_SignUp') {
    const expirationDate = new Date(Date.now() + 24 * 60 * 60 * 1000);
    // 自定义日期时间格式,这里用中文区域格式
    const formattedDate = expirationDate.toLocaleDateString('zh-CN');
    const formattedTime = expirationDate.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' });

    // 替换邮件内容
    event.response.emailSubject = '你的账户验证邮件';
    event.response.emailMessage = `请使用验证码 ${event.request.codeParameter} 完成账户验证
该验证码将在 ${formattedDate} ${formattedTime} 过期`;
  }
  return event;
};

步骤2:在CDK中关联Lambda到用户池

把上述Lambda函数作为触发器附加到Cognito用户池:

import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as cognito from 'aws-cdk-lib/aws-cognito';

// 创建Lambda函数
const customMessageLambda = new lambda.Function(this, 'CustomMessageLambda', {
  runtime: lambda.Runtime.NODEJS_18_X,
  handler: 'custom-message-trigger.handler',
  code: lambda.Code.fromAsset('path/to/your/lambda/code')
});

// 创建用户池并绑定触发器
const userPool = new cognito.UserPool(this, 'MyUserPool', {
  // 其他用户池配置...
  lambdaTriggers: {
    customMessage: customMessageLambda
  }
});

// 给Lambda授予必要的Cognito访问权限
userPool.grant(customMessageLambda, 'cognito-idp:AdminGetUser');

内容的提问来源于stack exchange,提问作者J. Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:05:19