【问题标题】:Nodejs cloud vision api PERMISSION_DENIED wrong project #Nodejs 云视觉 api PERMISSION_DENIED 错误项目#
【发布时间】:2019-02-14 09:32:41
【问题描述】:

当我尝试使用 Cloud Vision API 运行 firebase 函数并测试这些函数时。我收到此错误:

ERROR: { Error: 7 PERMISSION_DENIED: Cloud Vision API has not been 之前在项目 563584335869 中使用或已禁用。通过启用它 参观 https://console.developers.google.com/apis/api/vision.googleapis.com/overview?project=563584335869 然后重试。如果您最近启用了此 API,请等待几分钟 传播到我们的系统并重试的操作。

我不认识这个项目编号,并且我已经为我正在使用的项目启用了 API。我使用启用 API 的项目设置了GOOGLE_APPLICATION_CREDENTIALS。我做错了什么?

【问题讨论】:

    标签: node.js google-vision google-cloud-vision


    【解决方案1】:

    此错误消息通常在应用程序未正确验证时抛出,原因有多种,例如缺少文件、无效的凭据路径、不正确的环境变量分配等。

    基于此,我建议您验证是否正确分配了凭据文件和文件路径,并按照Obtaining and providing service account credentials manually 指南直接明确指定您的服务帐户文件进入你的代码;通过这种方式,您将能够永久设置它并验证您是否正确传递了服务凭据。此外,您可以查看this link,其中包含一个有用的分步指南,可将 Firebase 函数与 Vision API 结合使用,其中包括 Node.js 的 Vision 对象身份验证代码。

    在代码示例中将路径传递给服务帐户密钥:

    // Imports the Google Cloud client library.
    const Storage = require('@google-cloud/storage');
    
    // Instantiates a client. Explicitly use service account credentials by
    // specifying the private key file. All clients in google-cloud-node have this
    // helper, see https://github.com/GoogleCloudPlatform/google-cloud-node/blob/master/docs/authentication.md
    const storage = new Storage({
      keyFilename: '/path/to/keyfile.json'
    });
    
    // Makes an authenticated API request.
    storage
      .getBuckets()
      .then((results) => {
        const buckets = results[0];
    
        console.log('Buckets:');
        buckets.forEach((bucket) => {
          console.log(bucket.name);
        });
      })
      .catch((err) => {
        console.error('ERROR:', err);
      });
    

    【讨论】:

    • 我已经设置了 export GOOGLE_APPLICATION_CREDENTIALS="[PATH]" 并且当我输入 printenv 或在终端中设置时它显示为环境变量但是我仍然遇到相同的错误并且无法使用文章中的方法因为我正在使用最新版本的云视觉。
    • 您可以在 Vision API 客户端对象中指定 keyFilename 参数以将其指向 JSON 凭据文件。如Node.js Packages 文档中所述,Vision API 的最新 Node.js 包版本支持此功能。
    • 另外,请记住,当您在会话中设置环境变量值时,每次删除会话时都会重置它,并且只能在会话内访问,因此,建议直接在代码中明确指定您的服务帐户文件。
    【解决方案2】:

    对于那些仍然有这个问题的人来说,这对我有用:

    const client = new vision.ImageAnnotatorClient({
                keyFilename: 'serviceAccountKey.json'
              })
    

    【讨论】:

      【解决方案3】:

      API has not been used in project 563584335869

      如果您单击该链接已在控制台中打印,则会引导您访问此 URL。 https://console.developers.google.com/apis/api/vision.googleapis.com/overview?project=firebase-cli

      因此,该项目 id 意味着您使用了“firebase-cli”的项目凭据,而不是您的。

      如果你尝试设置环境的值,你可以在你的目录中找到变量

      ~/.config/firebase/...credentials.json
      

      并且有时在您尝试覆盖后它不会被替换。

      但是,您可以在代码中设置您的凭据。

      您可以在此处找到获取凭证的方法。 https://cloud.google.com/iam/docs/creating-managing-service-account-keys

      而且凭证格式是这样的。

      {
        "type": "service_account",
        "project_id": 
        "private_key_id": 
        "private_key": 
        "client_email":
        "client_id":
        "auth_uri": 
        "token_uri": 
        "auth_provider_x509_cert_url": 
        "client_x509_cert_url": 
      }
      

      当我使用另一个 google API 时,我遇到了与您完全相同的错误。并解决了这种方式,包括代码内部的凭证。

      const textToSpeech = require("@google-cloud/text-to-speech")
      const keyfile = require(".././my-project.json")
      const config = {
        projectId: keyfile.project_id,
        keyFilename: require.resolve(".././my-project.json")
      };
      const TTS_Client = new textToSpeech.TextToSpeechClient(config)
      

      【讨论】:

        猜你喜欢
        • 2016-06-02
        • 2018-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多