如何在Cypress中通过Google IAP身份验证进行页面测试?
解决Google IAP保护页面的Cypress测试403问题
你的核心问题有两个:一是获取IAP认证Token的方式错误,二是获取Token后未正确应用到页面请求中,导致访问时仍未通过IAP校验。以下是具体修正方案:
一、修正IAP Token获取逻辑
Google IAP的Web认证需要获取针对目标资源的ID Token,而非直接调用iap_web/auth接口。你需要先在Google Cloud控制台找到IAP保护资源的客户端ID(格式类似123456789-abcdef.apps.googleusercontent.com,在IAP设置的"OAuth客户端ID"处查看),再用google-auth-library生成对应Token。
修改cypress.config.ts的任务:
import { GoogleAuth } from 'google-auth-library'; // 替换为你的IAP客户端ID const IAP_CLIENT_ID = 'your-iap-client-id.apps.googleusercontent.com'; async setupNodeEvents(on, config): Promise<Cypress.PluginConfigOptions> { on('task', { getIAPToken: async () => { const auth = new GoogleAuth({ scopes: ['https://www.googleapis.com/auth/cloud-platform'], }); const client = await auth.getClient(); // 创建ID Token客户端并直接获取Token const idTokenClient = await client.getIdTokenClient(IAP_CLIENT_ID); const idToken = await idTokenClient.fetchIdToken(IAP_CLIENT_ID); return idToken; }, }); return config; },
二、修正Cypress测试流程
需先获取Token,再将Token设置为IAP认证所需的GCP_IAP_AUTH_TOKEN Cookie,最后访问页面。IAP Web应用依赖该Cookie校验身份。
修改test.cy.ts:
describe('Smoke tests', () => { it('content is not visible without auth', () => { cy.visit("https://some-page-behind-iap.com"); cy.contains("Content!").should('not.be.visible'); }); it('content is visible with IAP auth', () => { cy.task('getIAPToken').then((idToken) => { // 设置IAP认证Cookie,注意域名要和目标页面一致 cy.setCookie('GCP_IAP_AUTH_TOKEN', idToken, { domain: 'some-page-behind-iap.com', secure: true, httpOnly: true }); // 带认证Cookie访问页面 cy.visit("https://some-page-behind-iap.com"); cy.contains("Content!").should('be.visible'); }); }); });
三、检查服务账号权限
确保你使用的服务账号(JSON认证文件对应的账号)拥有IAP安全资源访问者(roles/iap.httpsResourceAccessor)角色,且该角色已绑定到目标IAP保护资源:
- 打开Google Cloud控制台的IAP页面
- 找到目标资源,点击右侧"添加成员"
- 输入服务账号邮箱,选择
roles/iap.httpsResourceAccessor角色 - 保存设置
内容的提问来源于stack exchange,提问作者TheTanadu
相关产品推荐
相关产品推荐

