当前位置: 首页 > 知识库问答 >
问题:

如何测试用户是否可以使用Cypress链接OAuth提供者?

傅树
2023-03-14

我正在做一个项目,在这个项目中,用户可以使用电话号码、谷歌或Github登录。我使用Firebase进行身份验证。我目前正在使用Cypress添加集成测试。我的问题是我无法正确测试用户是否可以链接或取消链接提供商。要链接提供者,我使用linkWithRedirect()firebase方法
起初,我试图模拟一次按钮点击。但这不起作用,因为Cypress不允许在一个测试中访问多个域
我的下一次尝试是使用linkWithCredential()方法。我从开发者工具中获取cookies和提供者的auth URL,以获取授权代码,并使用此代码获取访问令牌
获取Google令牌的My Cypress命令:

Cypress.Commands.add(
  'getGoogleToken',
  () => {
    cy.request({
      url: Cypress.env("GOOGLE_AUTH_URL"),
      headers: {
        cookie: Cypress.env("GOOGLE_AUTH_COOKIE")
      }, 
      followRedirect: false
    })
    .its("redirectedToUrl")
    .then(redirectedToUrl => {
      const url = new URL(redirectedToUrl);
      const code = url.searchParams.get("code");
      cy.request({
        url: "https://www.googleapis.com/oauth2/v4/token",
        method: "POST",
        form: true,
        body: {
          code,
          redirect_uri: Cypress.env("GOOGLE_REDIRECT_URI"),
          client_id: Cypress.env("GOOGLE_CLIENT_ID"),
          client_secret: Cypress.env("GOOGLE_CLIENT_SECRET"),
          grant_type: "authorization_code"
        }
      })
      .its("body")
      .then(body => body.access_token);
    });
});

使用这个令牌,我调用我自己的LinkBackGoogleBackToken方法,该方法调用LinkBackCredential方法:

Cypress.Commands.add(
  'linkWithGoogle', 
  () => {
    cy.getGoogleToken()
      .then(token => {
        cy.get("@auth")
          .invoke("linkWithGoogleWithToken", token);
      });
});

在我的测试中,我调用几个函数来链接一个提供者,然后链接另一个提供者,然后取消链接提供者,依此类推。有时此命令按预期工作,但有时它永远处于挂起状态。我不知道为什么。搜索没有帮助,似乎没有人遇到过这个问题
所以,我正在寻找以编程方式链接OAuth提供程序的方法,而不是使用UI。我正在考虑Firebase Admin SDK,但在其文档中找不到链接提供程序的方法。如果有人遇到这个问题,我将不胜感激。

共有1个答案

华英睿
2023-03-14

我发现了我为什么会有这个问题。关键是,在访问该页面后,我添加了一个别名来引用我的firebase函数:

Cypress.Commands.add(
  'init',
  () => {
    cy.visit("/");
    cy.window()
      .its("firebase")
      .its("auth").as("auth");
    cy.nullifyUsername();
});

第一次调用invoke方法时,一切正常。然后我重新加载了页面,因为我需要用这些信息更新页面。

cy.linkGoogle();
    cy.reload();
    cy.get("@googleButton")
      .contains(/^unlink$/i);

之后,下次我尝试链接另一个提供者时,invoke方法仍处于挂起状态。这是因为在重新加载页面后,我的别名被引用到一个不再存在的函数。我的解决方案是在重新加载页面后添加别名。因此,我为此创建了自定义命令:

Cypress.Commands.add(
  'refresh',
  () => {
    cy.reload();
    cy.window()
      .its("firebase")
      .its("auth").as("auth");
});
 类似资料:
  • 我想知道是否有人试图使用jmeter测试gRPC应用程序。 我希望 我可以使用非阻塞/异步存根编写一个gRPC客户端类,该存根对服务器进行非阻塞调用, 创建上述客户端的Jar 将Jar导入JMeter 使用Jeter BeanShell采样器中的Java方法 在花时间尝试上述方法之前,我想看看是否有人尝试过类似的方法 如果上述解决方法有效? 每个线程会创建一个单独的传输控制协议吗? 我们已经用py

  • 我的目标是以我的技能使用OAuth访问令牌读取/管理用户日历(Google/Microsoft/Apple)。如果只有一个帐户,我可以这样做。然而,我想让用户选择不同的账户(谷歌/微软/苹果)。我相信我们可以使用OAuth隐式授权类型来实现这一点。但我想使用OAuth'Auth Grant Type',它提供刷新令牌。因此,我不想要求用户在访问令牌过期时(1小时)再次链接帐户。有可能做到这一点吗?

  • 我有一个可以工作的DM命令,但如果我尝试DM一个关闭了DMs的人,会给出以下错误: 我如何让它检查用户是否打开了DMs?

  • 问题内容: 我想链接异步的REST服务调用,并在完成时具有单个回调。 番石榴有可能吗? 问题答案: 您可以将s 用于链接: 在终端中以上代码的输出:

  • 问题内容: 我熟悉Spring Boot JSP示例应用程序 但是该示例使用包装。是否可以这样做? 我的目标是简化s 的结构。 问题答案: 正如@Andy Wilkinson所说,与JSP相关的局限性。请打包您的应用程序,并以身份执行。在春季现场有记录。 对于Tomcat,如果使用war打包,它应该可以工作,即可执行的war将可以工作(…)。 由于Tomcat中的硬编码文件模式,可执行的jar将无

  • 我的目标是将放在下,以简化我的应用程序的结构。