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

Cognito用户长时间间隔后请求OTP重复收到两次问题咨询

问题分析与解决方案

针对你遇到的Cognito长时间未操作后请求OTP触发两次Lambda、收到两次验证码的问题,常见原因和解决方法如下:

核心原因排查

  1. Lambda冷启动超时触发Cognito重试
    长时间闲置后,Lambda函数会进入冷状态,第一次请求时初始化耗时可能超过Cognito触发器的超时阈值(默认5秒),Cognito会自动重试一次触发器,导致两次OTP发送。后续请求时Lambda已处于暖状态,执行速度达标,不会触发重试。

  2. 前端重复请求
    长时间未操作导致用户会话过期后,前端可能存在重复调用OTP请求的逻辑(比如按钮防抖失效、会话过期后的自动重试机制),直接发送了两次请求到Cognito,进而触发两次Lambda。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:54:38