Cognito用户长时间间隔后请求OTP重复收到两次问题咨询
问题分析与解决方案
针对你遇到的Cognito长时间未操作后请求OTP触发两次Lambda、收到两次验证码的问题,常见原因和解决方法如下:
核心原因排查
Lambda冷启动超时触发Cognito重试
长时间闲置后,Lambda函数会进入冷状态,第一次请求时初始化耗时可能超过Cognito触发器的超时阈值(默认5秒),Cognito会自动重试一次触发器,导致两次OTP发送。后续请求时Lambda已处于暖状态,执行速度达标,不会触发重试。前端重复请求
长时间未操作导致用户会话过期后,前端可能存在重复调用OTP请求的逻辑(比如按钮防抖失效、会话过期后的自动重试机制),直接发送了两次请求到Cognito,进而触发两次Lambda。Cognito触发器配置重复
检查Cognito用户池的自定义消息触发器是否被重复添加,或者存在其他关联触发器(如Pre Authentication)间接触发了两次OTP发送流程。
解决步骤
1. 优化Lambda冷启动问题
- 配置预留并发:给处理OTP的Lambda函数配置预留并发,确保函数始终保持暖状态,避免冷启动耗时。
- 精简Lambda代码:减少不必要的初始化操作(比如延迟加载SDK、移除冗余依赖),缩短函数启动时间。
2. 排查并修复前端请求逻辑
- 在前端添加请求日志,确认是否发送了两次OTP请求。
- 给请求按钮添加防抖处理,或者在会话过期后统一处理请求逻辑,避免重复调用。
3. 给Lambda添加幂等性保障
即使触发两次Lambda,也要保证只发送一次OTP。可以通过DynamoDB记录请求ID的方式实现幂等:
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB.DocumentClient(); exports.handler = async (event) => { const requestId = event.request.requestId; const logTable = 'OTPRequestLogs'; // 检查请求是否已处理 const existingLog = await dynamodb.get({ TableName: logTable, Key: { requestId } }).promise(); if (existingLog.Item) { return event; // 已处理,直接返回 } // 执行发送OTP的业务逻辑 // ... 替换为你实际的OTP发送代码(比如调用SMS服务) // 记录请求处理状态,设置TTL自动清理 await dynamodb.put({ TableName: logTable, Item: { requestId, processedAt: new Date().toISOString(), Expires: Math.floor(Date.now() / 1000) + 86400 // 24小时后过期 } }).promise(); return event; };
4. 检查Cognito触发器配置
进入Cognito用户池的“触发器”页面,确认自定义消息触发器只配置了一个,没有重复绑定同一Lambda函数。
内容的提问来源于stack exchange,提问作者Salini L
相关产品推荐
相关产品推荐

