向GCP Video Intelligence API发出请求时,权限被拒绝

jos*_*urz 3 google-cloud-platform gcp video-intelligence-api

因此,我可以使用快速入门中提供的示例视频向视频智能api发出有效请求。https://cloud.google.com/video-intelligence/docs/getting-started我也尝试了许多不同的方式对api进行身份验证。我正在使用的API令牌是从控制台中的“凭据”页面创建的。没有将它绑定到视频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"
}
Run Code Online (Sandbox Code Playgroud)

更新:

我将该文件设置为公共文件,并且可以正常工作。但是我需要以私有身份访问此文件,因此我向服务帐户授予了对该文件的访问权限,并尝试获取建议的API密钥。

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"
          }
        ]
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

似乎此打印访问令牌功能返回的令牌无效。我确实有一个API密钥,但是它没有访问存储桶的权限,而且我看不到提供API密钥访问权限的方法。

更新2:

因此,似乎我们将令牌设置为错误。我们正在遵循以下示例https://cloud.google.com/video-intelligence/docs/analyze-labels#videointelligence-label-file-protocol,这是我们从中获取apiKey = $ TOKEN的地方。但是看来我们需要设置Bearer Header。我们一开始确实尝试过此操作,但第一个问题是无法访问存储桶。所以谢谢。

Tux*_*ude 5

TL; DR-视频智能服务由于缺少权限而无法访问您的云存储桶中的文件。由于API使用了传递的服务帐户令牌的权限,因此您需要授予服务帐户权限,以读取GCS存储桶或整个GCS存储桶本身中的文件。

长版

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

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

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

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

gsutil acl ch -u SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com:READ gs://custom-bucket/IMG_3591.mov`
Run Code Online (Sandbox Code Playgroud)

我用在项目中创建的IAM服务帐户进行了确认,并使用它来调用视频智能API。该文件未公开,但仅授予该服务帐户“读者”权限。

我使用gcloud激活了服务帐户并获取了访问令牌,尽管您也可以使用google OAuth API手动进行此操作:

  • gcloud auth activate-service-account SERVICE_ACCOUNT_KEY.json
  • export TOKEN="$(gcloud auth print-access-token)"

使用gcloud创建IAM服务帐户的步骤在同一页面中