向 GCP Video Intelligence 发出请求时权限被拒绝 API
Permission Denied When Making Request to 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"
}
更新:
我将文件设置为 public 并且成功了。但我需要以私有方式访问它,所以我授予服务帐户访问该文件的权限,并尝试按照建议获取 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"
}
]
}
]
}
}
这个 print-access-token 函数返回的令牌似乎不起作用。我有一个 API 密钥,但它无权访问存储桶,而且我看不到提供 API 密钥访问权限的方法。
更新 2:
看来我们的令牌设置有误。我们遵循这个示例 https://cloud.google.com/video-intelligence/docs/analyze-labels#videointelligence-label-file-protocol,这是我们从中获得 apiKey=$TOKEN 的地方。但看起来我们需要设置 Bearer Header。我们一开始确实尝试过这个,但我们遇到了第一个问题,即无法访问存储桶。所以谢谢你。
TL;DR - 由于缺少权限,Video Intelligence 服务无法访问您的云存储桶上的文件。由于 API 使用传递的服务帐户令牌的权限,您需要授予您的服务帐户权限以读取 GCS 存储桶中的文件或整个 GCS 存储桶本身。
长版
您传递的访问令牌应对应于 IAM 服务帐户密钥。服务帐户将属于一个项目(您需要在其中启用视频智能 API 访问权限)并且服务帐户应该有权访问您尝试访问的 GCS 存储桶。
每个此类服务帐户都有一个关联的电子邮件 ID,格式为 SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
。
在云控制台中,您可以转到云存储 bucket/file 并为 IAM 服务帐户电子邮件地址授予 Reader
权限。没必要做这个桶public.
如果你使用gsutil
,你可以运行以下等效命令:
gsutil acl ch -u SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com:READ gs://custom-bucket/IMG_3591.mov`
我自己用我在项目中创建的 IAM 服务帐户确认了这一点,并用它来调用视频智能 API。文件未创建 public,但仅授予服务帐户 Reader 权限。
我使用 gcloud 激活服务帐户并获取访问令牌,尽管您也可以使用 google OAuth APIs:
手动执行此操作
gcloud auth activate-service-account SERVICE_ACCOUNT_KEY.json
export TOKEN="$(gcloud auth print-access-token)"
使用 gcloud 创建 IAM 服务帐户的步骤在 same page.
我可以重现这个问题。我认为问题在于您没有为 gs 存储桶中的视频文件设置适当的权限。要验证这个假设,请尝试公开共享它(Google 存储中 blob 旁边的复选框),然后再次 运行 请求。
因此我可以使用快速入门中提供的示例视频向视频智能 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"
}
更新:
我将文件设置为 public 并且成功了。但我需要以私有方式访问它,所以我授予服务帐户访问该文件的权限,并尝试按照建议获取 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"
}
]
}
]
}
}
这个 print-access-token 函数返回的令牌似乎不起作用。我有一个 API 密钥,但它无权访问存储桶,而且我看不到提供 API 密钥访问权限的方法。
更新 2:
看来我们的令牌设置有误。我们遵循这个示例 https://cloud.google.com/video-intelligence/docs/analyze-labels#videointelligence-label-file-protocol,这是我们从中获得 apiKey=$TOKEN 的地方。但看起来我们需要设置 Bearer Header。我们一开始确实尝试过这个,但我们遇到了第一个问题,即无法访问存储桶。所以谢谢你。
TL;DR - 由于缺少权限,Video Intelligence 服务无法访问您的云存储桶上的文件。由于 API 使用传递的服务帐户令牌的权限,您需要授予您的服务帐户权限以读取 GCS 存储桶中的文件或整个 GCS 存储桶本身。
长版
您传递的访问令牌应对应于 IAM 服务帐户密钥。服务帐户将属于一个项目(您需要在其中启用视频智能 API 访问权限)并且服务帐户应该有权访问您尝试访问的 GCS 存储桶。
每个此类服务帐户都有一个关联的电子邮件 ID,格式为 SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
。
在云控制台中,您可以转到云存储 bucket/file 并为 IAM 服务帐户电子邮件地址授予 Reader
权限。没必要做这个桶public.
如果你使用gsutil
,你可以运行以下等效命令:
gsutil acl ch -u SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com:READ gs://custom-bucket/IMG_3591.mov`
我自己用我在项目中创建的 IAM 服务帐户确认了这一点,并用它来调用视频智能 API。文件未创建 public,但仅授予服务帐户 Reader 权限。
我使用 gcloud 激活服务帐户并获取访问令牌,尽管您也可以使用 google OAuth APIs:
手动执行此操作gcloud auth activate-service-account SERVICE_ACCOUNT_KEY.json
export TOKEN="$(gcloud auth print-access-token)"
使用 gcloud 创建 IAM 服务帐户的步骤在 same page.
我可以重现这个问题。我认为问题在于您没有为 gs 存储桶中的视频文件设置适当的权限。要验证这个假设,请尝试公开共享它(Google 存储中 blob 旁边的复选框),然后再次 运行 请求。