我已经为函数的服务帐户提供了必要的权限("Secret Manager Secret Accessor"(,并且在部署时,firebase函数能够毫无问题地访问机密。
然而,当在本地开发中使用firebase serve
或firebase emulators:start --only functions
时,我会得到以下错误
未处理的错误错误:7 PERMISSION_DENIED:资源的权限"secretmanager.versions.access"被拒绝
我在文档中发现,需要在终端中输入设置export GOOGLE_APPLICATION_CREDENTIALS=pathtoserviceaccount.json
,尽管这对我来说也不起作用。
我会感谢所有的指点。干杯
我遇到了同样的问题,并尝试了从pureth的答案到添加本地重写的解决方案,但没有成功。对我来说有效的是在functions目录中创建.secret.local
文件,而不是在项目根目录中。
我的项目结构如下:
/
|- .firebaserc
|- firebase.json
|- package.json
|- /* ... */
|- functions/
|- .secret.local
|- package.json
|- /* ... */
因此,.secret.local
文件需要放在函数所在的目录中,而不是.firebaserc
文件所在的目录
另外,请注意,文件名以句点开头。
我自己找到了答案:当在本地模拟函数时,默认情况下它们不会由App Engine default service account
运行,这也需要启用。所以我不得不遵循这个教程https://firebase.google.com/docs/functions/local-shell
App Engine default service account
需要一个密钥,该密钥可以在谷歌云的服务帐户设置中创建,然后我必须进入
export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
在终端中。通过运行firebase emulators:start
,他们还获得了访问Secret Manager的权限。
因此,当我走在正确的轨道上时,我导出了错误的服务帐户密钥,而不是允许运行访问密钥管理器的密钥。
"[…]您可以通过设置.secret.local
文件来覆盖机密值。这使您可以轻松地在本地测试您的函数,尤其是在您无法访问机密值的情况下">
https://firebase.google.com/docs/functions/config-env#secrets_and_credentials_in_the_emulator
循序渐进:
- 请确保安装了最新版本的
firebase-tools
,因为此功能相对较新 - 在firebase项目的根目录中创建一个名为
secret.local
的文件(与.firebaserc
和firebase.json
一起( - 将您的机密添加到文件中,格式与常规
.env
文件相同。例如
MY_SECRET_1=foo
MY_SECRET_2=bar
- 运行模拟器
firebase emulators:start
- 在firebase函数中,访问进程对象上的机密。例如
process.env.MY_SECRET_1
注意,据我所知,机密仅在函数处理程序的块范围内可用。你不能在你的函数JS代码的根范围内访问它们(如果有人找到了这样做的方法,请在这里评论,因为我也想知道(
为了从使用本地模拟器运行的Firebase应用程序访问Secret Manager,您需要添加以下角色:
- ">密钥管理器密钥访问器";您的帐户用于通过Firebase进行身份验证
您可以通过在本地CLI中运行:firebase login
来验证它。
如果您已经登录,它应该以Already logged in as [email address]
进行响应。
此电子邮件地址是您需要将角色添加到的主体帐户。
正如你在问题中提到的;firebase adminsdk";服务帐户权限用于生产部署,但不用于本地部署,除非您使用export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
指定它