我觉得我已经阅读了所有可用的资料,但我仍然无法理解这一点。我非常喜欢 Google 的产品,但有时其文档的简洁性令人头疼。我阅读了这个令人难以置信的雄辩答案,这个答案的作者和我一样毫无头绪,但他觉得有必要写一本循序渐进的儿童指南。不幸的是,他的回答过于针对他的项目,而不是我的项目。我最喜欢的一句话是:
这就是疯狂的、未记录的部分。Google 云支持人员 甚至都不知道这一点。我从现有的 Firebase 项目(在 v2 之前部署,但之后针对 v2 进行了重构)中克隆了一些云功能到一个新项目中,但我遇到了以前从未遇到过的障碍。这是因为在过去,所有工作都是通过 Firebase 完成的,而现在,所有工作都是在 Google Cloud 中完成的。而且自第 2 版以来,GC 在安全协议和权限控制方面得到了大幅提升,但遗憾的是,文档却没有跟上。
以下函数会抛出权限不足错误:
const {initializeApp} = require("firebase-admin/app");
const {getAuth} = require("firebase-admin/auth");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
initializeApp();
exports.assignAdminPrivileges = onDocumentCreated("admins/{docId}", async (event) => {
try {
const doc = event.data.data();
const emailAddress = doc.private.emailAddress;
const userRecord = await getAuth().getUserByEmail(emailAddress);
return getAuth().setCustomUserClaims(userRecord.uid, {"admin": true});
} catch (error) {
throw new Error(error);
}
});
据我所知,该函数默认使用 Google Cloud 中的"默认计算服务帐户"进行身份验证,而该帐户没有足够的权限来执行该任务。而且,我认为该函数应该使用"Firebase Admin SDK 服务账户",而不是谷歌云账户自带的服务账户。老实说,我甚至不确定这样做是否可行,但我觉得这样做最合理。现在,有很多方法可以实现这一点,而我认为最适合我的用例的方法是下载 Firebase Admin SDK 服务账户的密钥,并在部署此功能时使用它,尽管谷歌警告我不要下载这个密钥。而且我必须将该密钥(打包为一个 JSON 文件)与源代码中对 Admin SDK 的自定义初始化配合使用。
const {initializeApp} = require("firebase-admin/app");
initializeApp({
凭据:// 我想这就是我需要的,但这里该放什么?
});
// 我要如何处理 JSON 文件?
- 如何在源代码中使用
Credential
如何处理从 GC 控制台成功获取的 JSON 文件,该文件包含 Admin SDK 服务帐户的凭据(包括其私钥)?
请尽可能提供具体信息,我将不胜感激。
在 Firebase Cloud Function 中使用 Firebase Admin SDK 服务帐号时,不需要明确提供凭据。这是因为当部署在 Firebase 环境中的函数运行时,它们会自动使用与的 Firebase 项目关联的服务帐号。
在的代码中,错误的原因很可能在于权限不足,而这与服务帐号无关,而是与该服务帐号被授予的角色有关。默认情况下,Firebase Admin SDK 服务帐号没有修改用户自定义声明的权限。要解决这个问题,需要向服务帐号授予“Identity and Access Management (IAM)”中的“Service Account Token Creator”角色。
以下是如何解决问题的方法:
1. 不需要在源代码中修改 initializeApp()
调用。 将其保留为空,Firebase SDK 将自动使用默认凭据。
2. 向服务帐号授予“Service Account Token Creator”角色:
- 打开 Google Cloud Console (https://console.cloud.google.com) 并导航到的项目。
- 在导航菜单中,转到“IAM & Admin” > “服务帐号”。
- 找到的 Firebase 项目的服务帐号。其名称通常类似于
firebase-adminsdk-[your-project-id]@[your-project-id].iam.gserviceaccount.com
。 - 点击服务帐号名称以打开其详细信息页面。
- 点击“权限”标签。
- 点击“授予访问权限”。
- 在“添加主体”字段中,输入的服务帐号的电子邮件地址。
- 在“选择角色”字段中,选择“IAM” > “Service Account Token Creator”。
- 点击“保存”。
授予此角色后,的 Cloud Function 应该能够使用 Firebase Admin SDK 成功更新用户自定义声明,而无需下载任何服务帐号密钥或在代码中进行任何其他更改。
重要说明: 下载服务帐号密钥通常不被视为最佳做法,因为它会带来安全风险。让的代码自动使用默认服务帐号凭据更安全、更易于管理。
标签:javascript,firebase,google-cloud-functions,firebase-tools,google-iam From: 78547472