azure-active-directory - 使用赛普拉斯的 e2e 测试中的身份验证错误:chrome-error://chromewebdata
问题描述
我正在使用 cypress 为我的 UI 编写 E2E 测试(请注意,它是 PowerBI 报告,因此是一种特殊情况)。当我使用公开报告进行测试时,它工作正常。但是当它是私人 PBI 报告时,我在登录部分遇到问题。经过一番研究,我发现这种方法对基于 Azure AD 的身份验证很有前景,并在我的 commands.js 文件中添加了这个登录功能:
Cypress.Commands.add('login', () => {
cy.request({
method: 'POST',
url: 'https://login.microsoftonline.com/{TENANT}/oauth2/token',
form: true,
body: {
grant_type: 'client_credentials',
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
// resource: RESOURCE
},
header: {
'Content-Type': 'multipart/form-data'
}
}).then((responseData) => {
if (responseData.status === 200) {
window.sessionStorage.setItem("adal.idtoken", responseData.body.access_token);
window.sessionStorage.setItem("adal.token.keys", CLIENT_ID + "|")
window.sessionStorage.setItem(`adal.expiration.key${CLIENT_ID}`, responseData.body.expires_on)
window.sessionStorage.setItem(`adal.access.token.key${CLIENT_ID}`, responseData.body.access_token)
} else {
console.log("error retrieving token")
}
})
})
请注意,客户端 ID 和密码是正确的,并且有权访问 powerbi 报告。我还测试了生成的令牌和 sessionStorage 变量,似乎都正确分配了。现在,在我的测试中:
describe("E2E Tests", () => {
beforeEach(() => {
cy.login();
})
it("Sample Test 1", () => {
cy.visit("https://powerbi-report-url.com");
//...
});
})
而且我在 cypress 测试运行程序中看到,即使在 beforeEach 中调用了 login,但在访问 powerbi 报告时,它仍然重定向到https://login.microsoftonline.com url,并使用不同的客户端 ID 作为查询参数,并且由于 powerbi 报告的超级域和重定向的 url 不同,它会给出chrome-error://chromewebdata
错误(我猜这就是原因)。因此想知道,如何在 azure ad auth 支持的 cypress 测试中登录网站。
此外,可能不相关,但在控制台中看到另一个错误:
Refused to display 'https://powerbi-report-url.com' in a frame because it set 'X-Frame-Options' to 'deny'.
编辑 1:切换到 Edge 不会出现 chrome webdata 错误,但对 URL 的 cy.visit 仍然会超时并给出 HTTP 431 错误(请求标头太长)并且无法进行身份验证。
编辑2(有关身份验证错误的更多详细信息):在使用客户端凭据生成令牌时,我正在获取令牌,并看到它存储在会话存储中,但是赛普拉斯测试没有选择相同的令牌来授权访问 PowerBI 报告. 因此,基本上即使存在 cookie 来验证请求,对 Power BI 访问的请求仍会重定向到 login.microsoftonline.com/common/oauth2/authorize?client_id={与我在上述 POST 中使用的不同的客户端 ID称呼}
鉴于,在使用用户名/密码时;收到此错误:“错误”:“interaction_required”,“error_description”:“AADSTS50079:由于管理员进行了配置更改,或者因为您移动到新位置,您必须注册多重身份验证才能访问“error_codes “:[50079]
解决方案
目前(20 年 4 月 17 日),这可能与赛普拉斯团队的未解决问题有关:https ://github.com/cypress-io/cypress/issues/4220
特别是对我来说,我曾经有一个超级域在以前的版本 4.3.0 中出现此错误,但现在使用 4.4.0,我得到更多域具有相同的问题。
当前解决方法:回滚到以前的版本并通过 Edge(无论如何基于 Chromium)运行。
推荐阅读
- python - 如何将 scikit-learn 数据集写入 csv 文件
- reactjs - 如何在 React Native 中使用 onPress 道具获得用户的选择
- javascript - 如何在第二页的radiobutton中传递按钮的值
- android-management-api - 注册 Android 5.1 设备无故失败
- react-native - 从选项卡导航器屏幕导航到堆栈导航器屏幕时,我无法在 react-native 中使用 react-navigation 传递参数
- python - 为什么我的多对多字段的值即使包含用户也是零?
- angular - 响应式,TypeScript
- javascript - 我无法使用 Phaser 3 中的创建功能将任何内容加载到画布上
- jquery - 水平而不是垂直显示jquery ui自动完成类别
- c - 当我尝试生成随机字符时,程序返回错误。警告 C4242: