You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Firebase模拟器中调用Cloud Vision遇权限拒绝问题求助

Firebase模拟器调用Cloud Vision报PERMISSION_DENIED的替代解决方法

问题描述

在Firebase模拟器套件中通过Cloud Functions调用Google Cloud Vision服务时,触发PERMISSION_DENIED错误。执行代码如下:

const functions = require("firebase-functions");
const { logger } = require("firebase-functions");
const vision = require("@google-cloud/vision");
const { getStorage } = require("firebase-admin/storage");

exports.bucketTesting = functions.https.onRequest(async (req, res) => {
  const fileBucket = await getStorage().bucket().getFiles();
  const bucketName = getStorage().bucket().name;
  const allFiles = fileBucket[0];

  const client = new vision.ImageAnnotatorClient();

  for (const file of allFiles) {
    const [result] = await client.labelDetection(
      `gs://${bucketName}/${file.name}`
    );
    console.log(result);
  }

  res.send({ bucketFiles: bucketName });
});

报错信息:

⚠ Google API requested!

  • URL: "https://oauth2.googleapis.com/token"
  • Be careful, this may be a production service. ⚠ functions: Error: 7 PERMISSION_DENIED: Caller does not have required permission to use project demo-project. Grant the caller the roles/serviceusage.serviceUsageConsumer role, or a custom role with the serviceusage.services.use permission, then retry. Propagation of the new permission may take a few minutes.

按提示操作后问题仍未解决,排查发现firebase.js中的项目ID为"demo-project",并非GCP账号下的真实项目ID,需找到除修改项目ID或新建同名GCP项目之外的解决办法。

替代解决方法

1. 为Cloud Vision客户端显式指定真实项目ID

初始化Vision客户端时,直接传入真实项目ID参数,覆盖默认的demo-project配置:

const client = new vision.ImageAnnotatorClient({
  projectId: "你的真实GCP项目ID"
});

同时确保Firebase Admin初始化时同步使用真实项目ID(若未配置):

const admin = require("firebase-admin");
if (!admin.apps.length) {
  admin.initializeApp({
    projectId: "你的真实GCP项目ID",
    storageBucket: "你的真实存储桶名称"
  });
}

2. 通过环境变量强制指定项目ID

启动Firebase模拟器前,设置环境变量覆盖默认项目ID:

  • Linux/macOS终端:
export GOOGLE_CLOUD_PROJECT="你的真实GCP项目ID"
firebase emulators:start
  • Windows命令提示符:
set GOOGLE_CLOUD_PROJECT="你的真实GCP项目ID"
firebase emulators:start
  • Windows PowerShell:
$env:GOOGLE_CLOUD_PROJECT="你的真实GCP项目ID"
firebase emulators:start

该环境变量会让所有Google Cloud SDK客户端(包括Vision)优先使用指定的真实项目ID。

3. 使用服务账号密钥文件绑定真实项目

通过服务账号密钥文件指定项目并完成权限认证:

  1. 从GCP控制台下载对应真实项目的服务账号密钥(需分配Cloud Vision Viewer/Editor及Storage相关权限)
  2. 启动模拟器前设置密钥路径环境变量:
export GOOGLE_APPLICATION_CREDENTIALS="/本地路径/你的服务账号密钥文件.json"
firebase emulators:start

密钥文件中包含真实项目ID,Vision客户端会自动读取该信息,同时提供合法的权限凭证。

4. 在firebase.json中配置模拟器项目ID

修改项目根目录下的firebase.json,为Functions模拟器指定真实项目ID:

{
  "emulators": {
    "functions": {
      "port": 5001,
      "env": {
        "GOOGLE_CLOUD_PROJECT": "你的真实GCP项目ID"
      }
    },
    "storage": {
      "port": 9199
    }
  }
}

配置后每次启动模拟器,Functions环境会自动加载指定的真实项目ID,无需手动重复设置环境变量。

内容的提问来源于stack exchange,提问作者Coolkid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:41:30