getTokenSilently 避免第三方 cookie 的等价物

getTokenSilentlyEquivalent that avoids third party cookies

我写了一个 cypress plugin 来帮助模拟 auth0 进行测试,而不必通过登录页面的整个重定向。

它使用静默身份验证或getTokenSilently 来避免重定向等

  return new Cypress.Promise((resolve, reject) => {
    let person = atom.slice(Cypress.spec.name, 'person').get();

    assert(!!person && typeof person.email !== 'undefined', `no scenario in login`);

    auth0Client.getTokenSilently({ ignoreCache: true, currentUser: person.email, test: Cypress.currentTest.title })
    .then((token) => {
      log(`successfully logged in with token ${JSON.stringify(token)}`);

      resolve(token);
    }).catch((e) => {
      console.error(e);

      reject(e);
    });
  })

auth0 文档似乎在说 silent authentication 不是单页应用程序的首选方式。

此 post Refresh token rotation 并未建议不使用第三方 cookie 的 getTokenSilently 替代方案。

如果我查看 @auth0/spa-js 中的源代码,getTokenSilently 似乎仍然使用 cookie,即使您有

scope: "offline_access",
useRefreshTokens: true

我对不使用第三方 cookie 的 getTokenSilently 替代品感到困惑。

由于这个原因,getTokenSilently 目前在 safari 中也不起作用。

安全 SPA 测试

最简单的全方位选项可能是在测试套件开始时进行完全重定向,如 this Curity code example,它使用 Cypress 测试。这样做的好处是 SPA 可以在之后调用真正的 APIs。它还适用于包括 Safari 在内的所有浏览器。这可能是我会使用的选项。

在客户端获取模拟令牌

我喜欢您的模拟插件想法,因为有时绕过某些授权服务器行为很有用,如果它妨碍了测试。

但感觉您无法控制的基础设施正在妨碍您。也许您的插件不需要依赖于客户端 SDK。也许您可以使用 JWT 库创建一个模拟 getTokenSilently 来发行自己的令牌?

但这取决于您接下来要做什么,例如,您是否要调用真正的 APIs?如果是这样,那么安全 SPA 测试选项可能是最简单的。

在 APIs

中使用模拟令牌

需要注意的一项有用技术是使用此方法的 Wiremock tool, which can register canned responses with tokens base on tokens you've issued in your own test code. Here are some API tests of mine

在我的例子中,API 默认需要用户级别的令牌和代码流。这些测试可实现更高效的 API 开发设置,其中 API 代码以标准方式验证模拟令牌。不过,它可能不太适合 SPA 测试。

静默重定向

在真实的 SPA 中,getTokenSilently 依赖授权服务器的(第三方)SSO cookie。代码流是 运行 在隐藏的 iframe 上使用 OpenID Connect 的 prompt=none 请求参数获取新令牌。这在具有默认设置的 Safari 浏览器中不起作用,因为它会删除 SSO cookie,作为防止第三方跟踪用户的举措的一部分。

前端的后端

要解决真实SPA中的上述问题,目前的最佳实践是使用第一方cookie,而不是依赖SSO会话cookie。 https://example.com 的 SPA 运行ning 可以使用 https://api.example.com 的 API 来启用此功能。 Token Handler Pattern.

中有关此主题的更多信息