You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:44:52