首页 > 编程问答 >如何初始化 FIrebase 云函数,以便使用凭据和 JSON 验证 Firebase Admin SDK 服务账户?

如何初始化 FIrebase 云函数,以便使用凭据和 JSON 验证 Firebase Admin SDK 服务账户?

时间:2024-05-30 10:35:22浏览次数:34  
标签:javascript firebase google-cloud-functions firebase-tools google-iam

我觉得我已经阅读了所有可用的资料,但我仍然无法理解这一点。我非常喜欢 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

相关文章

  • Javascript:如何替换 urls 和 youtube urls,并将 urls 替换为锚标签,将 youtube urls 替
    如果字符串返回:str=``https://www.google.comhttp://google.comhttps://www.youtube.com/live/gNIQWYgf-0https://www.youtube.com/embed/3ul2LYG6j14?si=fgxYHjyt6zBmoYErhttps://youtu.be/75Dhfjf6hfjfj这还必须考虑到......
  • 前端学习笔记——JavaScript基础语言的学习(三)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1,类型转换:把一种数据类型的变量转换成......
  • 前端学习笔记——JavaScript基础语言的学习(二)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1.数组的基本使用2.常量的基本使用......
  • javascript引入了不同版本的多个jquery,如何不同版本之间不互相影响
    1️⃣ 原因  由于是一个比较老的项目,所以在做功能时,用到了老项目的一个控件,这一个控件是以前封装好的,依赖的是jquery-1.6.min.js。但是在做下拉框多选功能时,在网上找了一个下拉框多选的框架,但是这个框架依赖是jquery.js(3.7.1),所以才出现了这个问题。  简单来说就是新老控件......
  • javascript右键菜单
      文章来源:https://segmentfault.com/a/1190000023098787 HTML<h1>Clickonblanktoshowcustomcontextmenus</h1>CSS.custom-context-menu{position:fixed;border:1pxsolid#ccc;list-style:none;padding:4px0;border-radius:......
  • JavaScript基础ECMAScript知识点复习整理
    **本篇文章食用的简单说明**本篇文章为复习JavaScript基础ECMAScript进行了知识点梳理,加粗部分为重点!!!加粗加红为重重点!!!由于JavaScript内容比较多,本篇文章只是基础部分,WebAPIs(DOM和BOM)等知识在后续过程中会继续更新,欢迎小伙伴在评论区补充~推荐大家按记忆梳理部分的内容自......
  • JavaScript中的let关键字详解
    在JavaScript中,let关键字用于声明局部变量,它与传统的var关键字类似,但引入了几个关键的区别和改进,主要体现在作用域规则、重复声明限制以及引入了“暂时性死区”等概念。下面将详细介绍let的特点及其与var的不同之处。块级作用域vs函数作用域var声明的变量:其作用域是函数......
  • JavaScript日期与时间处理的艺术
    JavaScript日期与时间处理的艺术基础概念:JavaScript中的日期对象诞生时刻时间戳:纪元的秘密案例一:格式化日期的艺术美化你的日期自定义格式化案例二:跨时区的舞蹈时区转换案例三:时间旅行的挑战闰年与月份天数避免日期计算的陷阱实战技巧与避坑指南性能优化安全性考量问......
  • JavaScript 中的 Range 和 Selection 对象
    JavaScript中的Range和Selection对象前言最近在做鼠标框选的需求,鼠标框选就需要用到Range和Selection对象。Range表示选择的区间范围,Selection表示选择的文档内容。下面就详细说下这两个对象一、RangeRange接口表示一个包含节点与文本节点的一部分的文档片段。......
  • 前端历程(包括html,JavaScript,jQuery,bootstrap)
    前端学习历程jQuery"""jQuery内部封装了原生的js代码(还额外添加了很多功能)能够让你通过书写更少的代码完成js操作类似于python里面的模块在前端模块不叫模块叫"类库"兼容多个浏览器的你在使用jQuery的时候就不需要考虑浏览器兼容问题jQuery的宗旨 writelessdom......