如何为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、测试数据库):
- 编写Lambda函数,在
CustomMessage_ForgotPassword触发时,将验证码与用户名关联存储 - 在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
相关产品推荐
相关产品推荐

