google-cloud-platform - 向 GCP Video Intelligence API 发出请求时权限被拒绝

标签 google-cloud-platform gcp video-intelligence-api

所以我可以使用快速入门中给出的示例视频向视频智能 api 发出有效请求。 https://cloud.google.com/video-intelligence/docs/getting-started我也尝试了许多不同的方式来对 api 进行身份验证。我使用的 API token 是从控制台中的凭据页面创建的。没有选项可以将它绑定(bind)到视频 api,所以我认为它应该会自动工作。 API 已在我的帐户上启用。

export TOKEN="foobar"
curl -XPOST -s -k -H"Content-Type: application/json" "https://videointelligence.googleapis.com/v1beta1/videos:annotate?key=$TOKEN" --data '{"inputUri": "gs://custom-bucket/IMG_3591.mov", "features": ["LABEL_DETECTION"]}'
{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

curl -XPOST -s -k -H"Content-Type: application/json" "https://videointelligence.googleapis.com/v1beta1/videos:annotate?key=$TOKEN" --data '{"inputUri": "gs://cloud-ml-sandbox/video/chicago.mp4", "features": ["LABEL_DETECTION"]}'
{
  "name": "us-east1.18013173402060296928"
}

更新:

我将文件设置为公共(public)文件并且它有效。但我需要以私有(private)方式访问它,因此我授予服务帐户访问文件的权限并尝试获取建议的 API key 。
export TOKEN="$(gcloud auth print-access-token)"
curl -XPOST -s -k -H"Content-Type: application/json" "https://videointelligence.googleapis.com/v1beta1/videos:annotate?key=$TOKEN" --data '{"inputUri": "gs://custom-bucket/IMG_3591.mov", "features":["LABEL_DETECTION"]}'
{
  "error": {
    "code": 400,
    "message": "API key not valid. Please pass a valid API key.",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.Help",
        "links": [
          {
            "description": "Google developers console",
            "url": "https://console.developers.google.com"
          }
        ]
      }
    ]
  }
}

此 print-access-token 函数返回的 token 似乎不起作用。我确实有一个 API key ,但它无权访问存储桶,而且我看不到提供 API key 访问权限的方法。

更新 2:

所以看起来我们设置的 token 是错误的。我们按照这个例子 https://cloud.google.com/video-intelligence/docs/analyze-labels#videointelligence-label-file-protocol这是我们从中获得 apiKey=$TOKEN 的地方。但看起来我们需要设置 Bearer Header。我们一开始确实尝试过,但我们遇到了第一个问题,即无法访问存储桶。所以谢谢。

最佳答案

TL;DR - 由于缺少权限,Video Intelligence 服务无法访问您的云存储桶上的文件。由于 API 使用正在传递的服务帐户 token 的权限,因此您需要授予服务帐户权限以读取 GCS 存储桶中的文件或整个 GCS 存储桶本身。

加长版

您传递的访问 token 应与 IAM 服务帐户 key 相对应。服务帐户将属于一个项目(您需要在其中启用视频智能 API 访问),并且服务帐户应该有权访问您尝试访问的 GCS 存储桶。

每个此类服务帐户都有一个关联的电子邮件 ID,格式为 SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com。 .

在云控制台中,您可以转到云存储桶/文件并授予Reader IAM 服务账户电子邮件地址的权限。无需公开此存储桶。

如果您使用 gsutil ,您可以运行以下等效命令:

gsutil acl ch -u SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com:READ gs://custom-bucket/IMG_3591.mov`

我自己使用我在项目中创建的 IAM 服务帐户确认了这一点,并使用它来调用视频智能 API。该文件未公开,但仅授予服务帐户的读取权限。

我使用 gcloud 来激活服务帐户并获取访问 token ,尽管您也可以使用 google OAuth API 手动执行此操作:
  • gcloud auth activate-service-account SERVICE_ACCOUNT_KEY.json
  • export TOKEN="$(gcloud auth print-access-token)"

  • 使用 gcloud 创建 IAM 服务帐户的步骤位于 same page .

    关于google-cloud-platform - 向 GCP Video Intelligence API 发出请求时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441055/

    相关文章:

    kubernetes - 无法将更改应用于 gCloud Kubernetes 引擎中与 ReadWriteOnce PV 绑定(bind)的部署?

    google-app-engine - 通过 App Engine 上的自定义域使用 Google IAP

    docker - Kubernetes:如何从保存的检查点部署容器?

    stackdriver - 我们可以禁用 GCP Stackdriver 对日志行的截断吗?

    firebase - 有没有办法在 Firebase 中配置 GCP 区域?

    python - 视频情报 : Caller does not have permission

    node.js - 是否有使用 Unix 域套接字连接到 SQL Server 实例的配置选项?

    python - 如何转换 Google AppEngine db.TimeProperty 中的时间字符串?