在本地主机上使用模拟器时的 Firebase AppCheck

问题描述 投票:0回答:2

开发人员在本地主机上使用模拟器进行本地开发时如何使用 Firebase App Check?您是否完全禁用本地主机上的应用程序检查?或者你可以在本地模拟App Check吗?

Firebase 有一些关于 将 App Check 与调试提供程序一起使用 的说明,但其用例似乎是当您想要在本地调试但在云中使用 GCP 的后端服务时。它看起来与针对模拟器进行开发无关。

在客户端中运行此命令会导致 recaptcha 应用程序认证失败,并显示 403 响应 (PERMISSION_DENIED),可能是因为 localhost 未列为允许的域:

  const appCheck = firebase.appCheck();
  appCheck.activate(
    process.env.REACT_APP_FIREBASE_APP_CHECK_SITE_KEY,
    true,
  );

在可调用函数中强制执行应用程序检查时,在模拟器中运行时

context.app
undefined
,因此请求将无法通过应用程序检查。

在本地禁用应用程序检查当然是一种选择,但想知道是否也有一种方法可以模拟应用程序检查。

node.js firebase emulation firebase-tools firebase-app-check
2个回答
3
投票

我已经设置好了,但并非没有经过大量的试验和错误。

尝试将此代码段添加到对活动 appCheck 的调用上方。似乎需要在激活 appCheck 之前进行。我遇到了同样的错误,直到我将调试片段移到活动调用之前。不过我使用的是网络版本 9...不确定这是否有什么不同。

if (process.env.NODE_ENV !== 'production') {
  self.FIREBASE_APPCHECK_DEBUG_TOKEN = true;
}

const appCheck = firebase.appCheck();
appCheck.activate(
  process.env.REACT_APP_FIREBASE_APP_CHECK_SITE_KEY,
  true,
);

这将在控制台打印一个令牌,需要将其添加到您的 Firebase 项目设置中。就像您提供的链接中所描述的那样。

您执行了这 2 个步骤后仍然收到 403 响应吗?


0
投票

Firebase 模拟器不会验证令牌,只要存在令牌即可。所以我让我的可调用函数准备就绪,就像它们在生产中一样。

export const myCallableFn = onCall(
{
    cors: [],
    enforceAppCheck: true,
  },
  async (request) => {
    // some business logic
  }

当客户端代码在开发模式下运行时,在我的前端逻辑上,我创建了一个假的证明提供程序:

window.onload = () => {
      console.log("window loaded");
    
      if (process.env.NODE_ENV === "development") {
        console.log("testing locally -- hitting local auth and firestore emulators");
        connectAuthEmulator(getAuth(), "http://localhost:9099", {
          disableWarnings: true,
        });
        connectFunctionsEmulator(functions, "localhost", 5001);
        initializeAppCheck(app, {
          provider: new CustomProvider({
            getToken: () => {
              return Promise.resolve({
                token: "fake-token",
                expireTimeMillis: Date.now() + 1000 * 60 * 60*24, // 1 day
              });
            }
          }),
    
          isTokenAutoRefreshEnabled: true,
        });
    
      }
      else {
        initializeAppCheck(app, {
          provider: new ReCaptchaEnterpriseProvider(
            "my-production-key"
          ),
          isTokenAutoRefreshEnabled: true,
        });
      }
    };

这样,即使没有互联网连接,我也可以使用带有 AppCheck 设置的模拟器

© www.soinside.com 2019 - 2024. All rights reserved.