【问题标题】:Error with authentication in e2e tests using cypress: chrome-error://chromewebdata使用赛普拉斯的 e2e 测试中的身份验证错误:chrome-error://chromewebdata
【发布时间】:2020-07-30 06:21:06
【问题描述】:

我正在使用 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:由于管理员进行了配置更改,或者因为您移动到了新位置,您必须注册多重身份验证才能访问 “错误代码”:[50079]

【问题讨论】:

    标签: azure-active-directory powerbi cypress adal powerbi-custom-visuals


    【解决方案1】:

    目前(20 年 4 月 17 日),这可能与赛普拉斯团队的一个未解决问题有关:https://github.com/cypress-io/cypress/issues/4220

    特别是对我来说,以前的 4.3.0 版本有一个超级域出现此错误,但现在使用 4.4.0,我得到更多域具有相同问题。

    当前解决方法:回滚到以前的版本并通过 Edge 运行(无论如何它都基于 Chromium)。

    【讨论】:

    • 感谢@ebanster 的建议。现在切换到 Edge 后,我没有收到 chrome webdata 错误。但是当我访问主 URL 时,它会重定向到登录身份验证 URL,并给出超时错误。您知道为什么它没有获取 sessionStorage 凭据(在 cy.login() 步骤中设置)来验证请求吗?另外,当我检查cookie“cypress-session-cookie”时,它是空的。
    • 在命令起作用之前看看是否包含这个:cy.clearCookies({ domain: null })
    • 访问测试 URL 时出现错误:加载资源失败:服务器响应状态为 431(请求标头字段太大)
    • 您可以尝试清除赛普拉斯应用数据吗? docs.cypress.io/guides/references/…
    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2021-10-29
    • 2022-01-03
    • 2022-10-24
    相关资源
    最近更新 更多