如何使用Cypress绕过Google Authenticator 2FV完成网站登录?
绕过Google Authenticator双因素认证的Cypress测试方案
针对你的Cypress登录测试需求,这里提供几种可行的绕过Google Authenticator 2FA的方案,按推荐优先级排序:
1. 使用测试环境专属的2FA白名单/固定验证码
绝大多数正规系统会为测试环境提供专属的2FA简化机制,比如给测试账号设置固定不变的验证码,或者直接跳过2FA校验。这是最安全且符合测试规范的方案。
修改你的测试代码示例(假设测试环境固定验证码为123456):
describe('empty spec', () => { it('passes', () => { cy.visit('website') cy.get('[data-selenium-id="email"]').click() cy.get('[name="email"]').type("test_mail@example.com") cy.get('[name="password"]').type("TestPass123") cy.get('[data-selenium-id="signInForm.signInButton"]').click() // 输入测试环境固定2FA验证码 cy.get('[name="totp-code"]').type("123456") // 替换为实际测试环境的固定码 cy.get('[data-selenium-id="verify-button"]').click() // 替换为实际验证按钮的选择器 }) })
2. 基于TOTP算法实时计算验证码
Google Authenticator采用TOTP(基于时间的一次性密码)算法,只要你能拿到测试账号对应的2FA密钥(secret),就可以用工具库计算出实时有效的验证码。
步骤:
- 安装TOTP计算库:
npm install speakeasy --save-dev
- 修改测试代码(注意密钥不要硬编码,用环境变量管理):
const speakeasy = require('speakeasy'); describe('empty spec', () => { it('passes', () => { cy.visit('website') cy.get('[data-selenium-id="email"]').click() cy.get('[name="email"]').type("test_mail@example.com") cy.get('[name="password"]').type("TestPass123") cy.get('[data-selenium-id="signInForm.signInButton"]').click() // 从环境变量获取2FA密钥,避免硬编码泄露 const totpSecret = Cypress.env('TOTP_SECRET'); // 计算当前有效的TOTP验证码 const token = speakeasy.totp({ secret: totpSecret, encoding: 'base32' // Google Authenticator的密钥默认是base32编码 }); // 输入验证码完成登录 cy.get('[name="totp-code"]').type(token) cy.get('[data-selenium-id="verify-button"]').click() }) })
- 配置环境变量:在
cypress.config.js或.env文件中设置TOTP_SECRET的值,确保密钥不被提交到版本控制系统。
3. 通过后端API跳过2FA校验
如果你的团队有权限修改后端逻辑,可以为测试环境的登录接口添加跳过2FA的参数,或者直接为测试账号设置自动跳过2FA的规则,然后通过API登录绕过前端的2FA页面。
示例代码:
describe('empty spec', () => { it('passes via API login', () => { // 直接调用后端登录接口,传入跳过2FA的参数 cy.request({ method: 'POST', url: '/api/auth/login', // 替换为实际登录接口地址 body: { email: "test_mail@example.com", password: "TestPass123", skip_2fa: true // 假设后端支持该参数 } }).then((response) => { // 将登录后的认证令牌设置到Cookies中 cy.setCookie('auth_token', response.body.access_token); // 直接跳转至需要登录的页面,无需走前端登录流程 cy.visit('/dashboard'); }) }) })
4. 复用已登录的Cookies缓存
手动完成一次完整的登录(包括2FA验证),然后导出浏览器的登录Cookies,在测试中直接导入这些Cookies,跳过整个登录流程。
示例代码:
describe('empty spec', () => { beforeEach(() => { // 导入手动登录后获取的Cookies cy.setCookie('auth_token', 'your_valid_auth_token'); cy.setCookie('user_session', 'your_valid_session_id'); // 根据实际系统的Cookies名称添加更多项 }) it('passes with cached cookies', () => { cy.visit('/dashboard'); // 直接执行后续的测试逻辑 }) })
- 注意:Cookies有有效期,过期后需要重新手动获取更新。
内容的提问来源于stack exchange,提问作者Nacho
相关产品推荐
相关产品推荐

