AzureDevOps项目中Cypress使用cy.setCookie()无法登录求助
Cypress 处理AAD/OAuth2.0无登录API的授权方案
问题背景
项目采用OAuth2.0 + AAD实现登录流程,无直接登录POST接口,访问登录页会触发无限重定向最终报414错误。尝试通过cy.setCookie()预设置JWT令牌时,出现Sanitizing cookie failed错误,已开启chromeWebSecurity: false,尝试过第三方浏览器、cy.origin()均无效。
错误原因分析
Sanitizing cookie failed通常由以下原因导致:
- JWT令牌过长(超过浏览器cookie大小限制,一般为4KB)
cy.setCookie()参数配置错误(如domain带协议、secure与网站协议不匹配)- 令牌包含非法字符或格式错误(如换行、空格)
可行解决方案
1. 修正cy.setCookie()参数配置
确保参数符合浏览器规则:
- domain:去掉协议前缀(如
dev.boostapps.com,而非https://dev.boostapps.com) - secure:若网站为HTTPS协议,必须设为
true(浏览器会拒绝在HTTPS站点设置非secure cookie) - expiry:添加过期时间戳,避免令牌立即失效
- 确保JWT令牌为纯字符串,无多余换行或空格
示例代码:
describe('Mock authentication so I can test the website', () => { beforeEach(() => { cy.clearCookies(); }) it('Visits BoostApps dev site', () => { cy.viewport(1200, 1800) cy.setCookie('access_token', '你的JWT令牌', { domain: 'dev.boostapps.com', // 仅保留域名,去掉协议 path: '/', secure: true, // HTTPS站点必须设为true httpOnly: false, expiry: Math.floor(Date.now() / 1000) + 3600 // 1小时后过期 }); cy.getCookie('access_token').should('exist'); cy.visit('网站URL', { failOnStatusCode: false }); cy.contains('Competitions').click(); }); });
2. 模拟OAuth2.0授权流程绕过UI登录
直接调用AAD授权端点完成登录,获取令牌后设置到cookie/localStorage:
it('通过AAD授权流程获取令牌登录', () => { const tenantId = '你的AAD租户ID'; const clientId = '应用注册的客户端ID'; const redirectUri = encodeURIComponent('网站的回调地址'); const scope = encodeURIComponent('openid profile email'); // 访问AAD授权页 cy.visit(`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/authorize?client_id=${clientId}&response_type=id_token%20token&redirect_uri=${redirectUri}&scope=${scope}&nonce=12345`); // 填写测试账号密码(若允许自动化输入) cy.get('#i0116').type('测试账号邮箱'); cy.get('#idSIButton9').click(); cy.get('#i0118').type('测试账号密码'); cy.get('#idSIButton9').click(); cy.get('#idBtn_Back').click(); // 跳过保持登录提示 // 登录成功后提取令牌并设置 cy.window().then((win) => { const accessToken = win.localStorage.getItem('access_token'); // 或从cookie中提取 cy.setCookie('access_token', accessToken, { domain: 'dev.boostapps.com', path: '/', secure: true, httpOnly: false }); }); cy.visit('网站URL'); cy.contains('Competitions').click(); });
3. 直接设置localStorage/sessionStorage
部分网站会将令牌存储在localStorage而非cookie,可直接操作存储:
cy.window().then((win) => { win.localStorage.setItem('access_token', '你的JWT令牌'); win.localStorage.setItem('id_token', '你的ID令牌'); // 若需要ID令牌 }); cy.visit('网站URL'); cy.contains('Competitions').click();
4. 使用Cypress Session API缓存登录状态
避免重复登录,提升测试效率:
beforeEach(() => { cy.session('logged-in-session', () => { // 这里放入完整的登录逻辑(如上述AAD授权流程) cy.visit('AAD授权URL'); // 完成账号密码输入、授权步骤... }); }); it('访问网站测试功能', () => { cy.visit('网站URL'); cy.contains('Competitions').click(); });
内容的提问来源于stack exchange,提问作者Pär Ershag
相关产品推荐
相关产品推荐

