如何用Cypress测试多因素认证?求免费/低成本OTP读取工具
Cypress中读取MFA OTP的免费/低成本方案
1. 测试环境专用OTP接口(推荐)
如果你的应用有自己的后端,可以在测试环境中添加一个仅用于测试的接口,直接返回指定用户的OTP。这种方式完全可控,无外部依赖,成本最低。
- 实现思路:后端在生成OTP时,同时将其存储到测试专用的缓存或数据库中,提供一个接口供测试调用,传入用户标识(邮箱/手机号)即可获取当前有效的OTP。
- Cypress代码示例:
// 完成登录请求,触发OTP发送后 cy.request({ method: 'POST', url: '/test/get-otp', // 测试环境专用接口 body: { email: 'test-mfa-user@example.com' } }).then((res) => { const otp = res.data.otp; cy.get('#otp-input').type(otp); cy.get('#verify-btn').click(); });
- 优点:稳定可靠,无外部服务依赖,无需额外成本。
- 缺点:需要后端开发少量代码,仅适用于自己可控的应用。
2. 免费临时邮箱API
利用免费的临时邮箱服务的API来获取邮件内容,解析其中的OTP。这类服务大多提供免费的公开API,适合测试使用。
- 实现思路:
- 测试前调用API生成一个临时邮箱
- 使用该邮箱注册用户并启用MFA
- 调用API获取收件箱中的邮件,提取OTP
- Cypress代码示例:
// 生成临时邮箱 cy.request('GET', 'https://www.1secmail.com/api/v1/?action=genRandomMailbox&count=1') .then((res) => { const testEmail = res.body[0]; // 填写邮箱并完成注册流程 cy.get('#email-input').type(testEmail); cy.get('#register-btn').click(); // ... 完成MFA启用步骤,触发OTP发送 // 轮询获取邮件 const getOtp = () => { const [login, domain] = testEmail.split('@'); return cy.request(`https://www.1secmail.com/api/v1/?action=getMessages&login=${login}&domain=${domain}`) .then((msgsRes) => { if (msgsRes.body.length === 0) { cy.wait(3000); return getOtp(); // 递归轮询,直到收到邮件 } const msgId = msgsRes.body[0].id; return cy.request(`https://www.1secmail.com/api/v1/?action=readMessage&login=${login}&domain=${domain}&id=${msgId}`); }); }; getOtp().then((msgRes) => { // 正则匹配6位OTP(根据实际格式调整) const otpMatch = msgRes.body.body.match(/\d{6}/); if (otpMatch) { cy.get('#otp-input').type(otpMatch[0]); cy.get('#verify-btn').click(); } }); });
- 优点:完全免费,无需额外配置。
- 缺点:服务稳定性不可控,可能有请求频率限制,仅支持邮件类OTP。
3. Twilio免费试用额度(适合短信OTP)
如果你的MFA是通过短信发送OTP,可以使用Twilio的免费试用账号来接收短信并读取内容。Twilio提供免费的试用额度,足够日常测试使用。
- 实现思路:
- 注册Twilio试用账号,获取一个免费的测试手机号
- 在Cypress环境变量中配置Twilio的Account SID、Auth Token和测试手机号
- 触发短信OTP发送后,调用Twilio API获取最新短信,提取OTP
- Cypress代码示例:
// 从环境变量读取Twilio配置 const accountSid = Cypress.env('TWILIO_ACCOUNT_SID'); const authToken = Cypress.env('TWILIO_AUTH_TOKEN'); const testPhone = Cypress.env('TWILIO_TEST_PHONE'); // 完成登录步骤,触发短信OTP发送后 cy.request({ method: 'GET', url: `https://api.twilio.com/2010-04-01/Accounts/${accountSid}/Messages.json`, auth: { user: accountSid, pass: authToken }, qs: { To: testPhone, PageSize: 1 // 获取最新的一条短信 } }).then((res) => { const latestMsg = res.body.messages[0]; const otpMatch = latestMsg.body.match(/\d{6}/); if (otpMatch) { cy.get('#otp-input').type(otpMatch[0]); cy.get('#verify-btn').click(); } });
- 优点:支持短信OTP,服务稳定,免费额度足够测试。
- 缺点:需要注册Twilio账号,试用到期后若需继续使用需付费,但成本较低。
内容的提问来源于stack exchange,提问作者Tirath Sojitra
相关产品推荐
相关产品推荐

