如何让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
相关产品推荐
相关产品推荐

