Firebase Emulator调用Google Cloud Speech-to-Text API权限被拒绝如何解决
问题原因与修复方案
核心报错原因
- 你设置的
GCLOUD_PROJECT和GOOGLE_APPLICATION_CREDENTIALS环境变量仅作用于模拟器启动的父进程,模拟器内部运行的云函数触发器默认会使用Firebase CLI内置的默认测试项目ID(也就是错误中提到的563584335869)作为请求上下文,不会继承本地shell的环境变量,所以请求实际上是发送到了不存在的默认测试项目上,自然会提示API未启用。 - 如果你没有在自己的真实谷歌云项目中提前启用Speech-to-Text API,即便配置了正确的上下文也会触发同类权限错误。
修复步骤
1. 确认真实项目已启用对应API
登录谷歌云控制台,在你的实际项目my-actual-glcloud-project-id中确认Speech-to-Text API已经启用,排除API未启用的问题。
2. 给云函数注入正确的运行环境变量
不要仅在启动模拟器的shell中设置环境变量,需要直接将配置注入到模拟器的云函数运行环境中,两种常用方案二选一即可:
- 方案1:修改
firebase.json配置,在模拟器节点下新增函数的环境变量配置,示例如下:
{ "functions": { "source": "functions" }, "emulators": { "functions": { "port": 5001, "env": { "GCLOUD_PROJECT": "my-actual-glcloud-project-id", "GOOGLE_APPLICATION_CREDENTIALS": "./path/to/service-account.json" } }, "storage": { "port": 9199 }, "auth": { "port": 9099 }, "ui": { "enabled": true } } }
- 方案2:启动模拟器时直接用
--env参数传递环境变量:
firebase emulators:start \ --env GCLOUD_PROJECT=my-actual-glcloud-project-id \ --env GOOGLE_APPLICATION_CREDENTIALS=./path/to/service-account.json
注意替换配置中的项目ID、服务账号文件路径为你自己的实际值,服务账号文件路径建议写绝对路径,或者相对于项目根目录的相对路径。另外启动模拟器时不要加--project demo-*类的参数,否则会强制使用测试demo项目上下文。
3. 显式指定Speech客户端的项目ID
如果在云函数中初始化Speech-to-Text客户端时没有显式传入项目ID,建议补充传入,避免客户端自动读取默认的测试项目ID,以下是Node.js示例:
const speech = require('@google-cloud/speech'); const client = new speech.SpeechClient({ projectId: 'my-actual-glcloud-project-id' });
内容的提问来源于stack exchange,提问作者CambodianCoder
相关产品推荐
相关产品推荐

