Отказано в доступе при отправке запроса к API GCP Video Intelligence
Таким образом, я могу сделать действительный запрос к 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"
}
Обновить:
Я установил файл как публичный, и он работал. Но мне нужно получить доступ к нему как к частному, поэтому я дал доступ к файлу учетной записи службы и попытался получить ключ 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, откуда мы и получили apiKey=$TOKEN. Но похоже, что нам нужно было установить заголовок носителя. Сначала мы попробовали это, но у нас возникла первая проблема, связанная с отсутствием доступа к корзине. Так что спасибо тебе.
2 ответа
TL; DR - служба Video Intelligence не может получить доступ к файлу в вашем хранилище Cloud из-за отсутствия разрешений. Поскольку API использует разрешения передаваемого маркера учетной записи службы, вам необходимо предоставить разрешения учетной записи службы для чтения файла в корзине GCS или во всей корзине GCS.
Длинная версия
Маркер доступа, который вы передаете, должен соответствовать ключу учетной записи службы IAM. Учетная запись службы будет принадлежать проекту (для которого необходимо включить доступ к API-интерфейсу Video Intelligence), а учетная запись службы должна иметь разрешения для доступа к корзине GCS, к которой вы пытаетесь получить доступ.
У каждой такой учетной записи службы есть связанный идентификатор электронной почты в форме SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
,
В облачной консоли вы можете перейти к хранилищу / файлу хранилища Cloud и предоставить Reader
разрешения для адреса электронной почты учетной записи службы IAM. Нет необходимости делать это ведро публичным.
Если вы используете gsutil
, вы можете запустить следующую эквивалентную команду:
gsutil acl ch -u SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com:READ gs://custom-bucket/IMG_3591.mov`
Я сам подтвердил это с помощью учетной записи службы IAM, которую я создал в своем проекте, и использовал ее для вызова API видеоразведки. Файл не был обнародован, но предоставил разрешения Reader только для учетной записи службы.
Я использовал gcloud для активации учетной записи службы и получения токена доступа, хотя вы можете сделать это и вручную, используя API Google OAuth:
gcloud auth activate-service-account SERVICE_ACCOUNT_KEY.json
export TOKEN="$(gcloud auth print-access-token)"
Шаги по созданию учетной записи службы IAM с использованием gcloud находятся на той же странице.
Я могу воспроизвести эту проблему. Я считаю, что проблема в том, что у вас нет правильной настройки разрешения для вашего видеофайла в вашем gs-ведре. Чтобы проверить эту гипотезу, попробуйте поделиться ею публично (флажок рядом с BLOB-объектом в Google Storage), а затем снова выполните запрос.