开发人员在本地主机上使用模拟器进行本地开发时如何使用 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
,因此请求将无法通过应用程序检查。
在本地禁用应用程序检查当然是一种选择,但想知道是否也有一种方法可以模拟应用程序检查。
我已经设置好了,但并非没有经过大量的试验和错误。
尝试将此代码段添加到对活动 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 响应吗?
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 设置的模拟器