使用 Cypress 进行 Auth0 身份验证

Cha*_*wis 5 javascript reactjs auth0 cypress

我正在尝试为 Cypress 创建登录命令,并注意到他们关于如何执行此操作的博客与Auth0 React SDK的预期值不匹配。看起来他们使用了自定义的 Express 应用程序来处理登录,而不是使用 SDK 来处理登录(根据官方 Auth0 文档)。

Cypress官方文档生成了一个本地存储键值对,如下所示。

const item = {
        body: {
          decodedToken: {
            claims,
            user: { ... },
            audience,
            client_id,
          },
        },
        expiresAt: exp,
      }

window.localStorage.setItem('auth0Cypress', JSON.stringify(item))
Run Code Online (Sandbox Code Playgroud)

然而,由 Auth0 React SDK 创建的生成的内容类似于:

const item = {
      body: {
        access_token,
        audience,
        client_id,
        decodedToken: {
          claims,
          user: { ... },
          encoded,
          header
        },
        expires_in,
        id_token,
        scope,
        token_type
      },
      expiresAt: exp
    }

window.localStorage.setItem(`@@auth0spajs@@::${client_id}::${audience}::${scope}`, JSON.stringify(item))
Run Code Online (Sandbox Code Playgroud)

我能够使https://${auth)_domain}/oauth/token请求正常工作,但是无法弄清楚如何从响应中获取数据,以使其适合 Auth0 React SDK 想要的数据结构。

有人在这方面取得过成功吗?


经过一番探索后,我收到的响应似乎/oauth/token并不包含 Auth0 React SDK 登录时输出的值的所有字段。

我还注意到Auth0 有一个关于如何与 Cypress 集成的指南,但它不使用此 SDK,而是使用 SPA SDK。该指南还使用自定义登录表单,我在其中使用 LockUI。

需要注意的一件事是,我没有使用后端进行身份验证(就像大多数示例一样)。我loginWithRedirect按照官方建议使用登录。

Cha*_*wis 4

经过一些调查和 Auth0 团队的帮助,我成功地完成了这项工作。

这是我使用的代码:

Cypress.Commands.add("login", () => {
  cy.clearLocalStorage();

  const email = "";
  const password = "";
  const client_id = "";
  const client_secret = "";
  const audience = "";
  const scope = "";

  cy.request({
    method: "POST",
    url: "",
    body: {
      grant_type: "password",
      username: email,
      password,
      audience,
      scope,
      client_id,
      client_secret,
    },
  }).then(({ body: { access_token, expires_in, id_token, token_type } }) => {
    cy.window().then((win) => {
      win.localStorage.setItem(
        `@@auth0spajs@@::${client_id}::${audience}::${scope}`,
        JSON.stringify({
          body: {
            client_id,
            access_token,
            id_token,
            scope,
            expires_in,
            token_type,
            decodedToken: {
              user: JSON.parse(
                Buffer.from(id_token.split(".")[1], "base64").toString("ascii")
              ),
            },
            audience,
          },
          expiresAt: Math.floor(Date.now() / 1000) + expires_in,
        })
      );
      cy.reload();
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

您必须确保您传入的配置与您在 Auth0 Provider 中使用的配置完全相同

需要注意的一件事让我绊倒,那就是我也在使用刷新令牌。如果是这种情况,请确保添加offline_access到您的范围中。

我有一个公共存储库来下载工作解决方案 - https://github.com/charklewis/auth0-cypress