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

如何为Cognito「忘记密码」流程添加Cypress端到端测试并获取验证码

解决Cypress中获取Amazon Cognito忘记密码验证码的问题

以下是几种可行的实现方案,适配不同测试环境配置:

方案1:利用Cognito Admin API(测试环境专用)

通过Cognito的AdminGetUser API可获取用户验证记录,注意仅适用于测试环境(需配置cognito-idp:AdminGetUser的IAM权限)。在Cypress测试代码中直接调用该API:

cy.request({
  method: 'POST',
  url: 'https://cognito-idp.<region>.amazonaws.com/',
  headers: {
    'Content-Type': 'application/x-amz-json-1.1',
    'X-Amz-Target': 'AWSCognitoIdentityProviderService.AdminGetUser'
  },
  body: {
    UserPoolId: '<你的用户池ID>',
    Username: '<测试用户名>'
  },
  auth: {
    username: '<IAM Access Key>',
    password: '<IAM Secret Key>'
  }
}).then(response => {
  // 根据实际返回结构提取验证码(示例逻辑)
  const verificationCode = response.body.UserAttributes.find(attr => attr.Name === 'email_verified')?.Value;
  cy.get('#verification-code-input').type(verificationCode);
});

方案2:自定义Cognito发送验证码触发器

通过Cognito的自定义消息Lambda触发器,在发送验证码时同步将其存入测试存储服务(如Redis、测试数据库):

  1. 编写Lambda函数,在CustomMessage_ForgotPassword触发时,将验证码与用户名关联存储
  2. 在Cypress中调用测试接口从存储服务提取验证码

示例Lambda核心逻辑(Node.js):

exports.handler = async (event) => {
  if (event.triggerSource === 'CustomMessage_ForgotPassword') {
    const { username, codeParameter } = event;
    // 将验证码存入测试存储,设置5分钟过期
    await redisClient.set(`cognito:forgot-password:${username}`, codeParameter, 'EX', 300);
  }
  return event;
};

Cypress中获取验证码:

cy.request(`/test-api/get-verification-code?username=${testUsername}`)
  .then(response => {
    cy.get('#verification-code-input').type(response.body.code);
  });

方案3:覆写应用端测试环境的验证码逻辑

在测试环境的应用代码中,修改自定义Auth服务,直接将验证码暴露给Cypress:

const customAuthServices = {
  async handleForgotPassword(username: string) {
    if (process.env.NODE_ENV === 'test') {
      const testCode = '123456'; // 可随机生成固定格式验证码
      // 通过window对象暴露给Cypress
      (window as any).cognitoTestCode = testCode;
      return Promise.resolve({
        CodeDeliveryDetails: {
          AttributeName: "email",
          DeliveryMedium: "EMAIL",
          Destination: "test@example.com"
        }
      });
    }
    // 生产环境正常调用Cognito API
    return Auth.forgotPassword(username);
  }
};

Cypress测试中读取验证码:

cy.window().then(win => {
  const verificationCode = win.cognitoTestCode;
  cy.get('#verification-code-input').type(verificationCode);
});

内容的提问来源于stack exchange,提问作者Case Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 07:55:18