Как создать токен носителя для cURL для прохождения через IAP (GCP)?
Мне нужно cURL веб-приложение, размещенное за IAP на GCP.
Обычно пользователи входят в систему через IAP и используют веб-приложение, но мне нужно запустить некоторые команды cURL (интерактивные и неинтерактивные), которые обращаются к URL-адресам веб-приложения (например:https://myapp.com/get_pics/1)
Я не могу понять, как получить токен носителя от GCP, который я могу использовать в заголовке авторизации для cURL.
Я могу настроить учетную запись службы с ролью «Пользователь веб-приложения, защищенный IAP», и у меня есть ключ JSON для этой учетной записи службы, но я не уверен, куда идти после этого, чтобы получить правильный токен носителя, который будет принимать IAP.
2 ответа
Для IAP вам необходимо предоставить токен идентификации OIDC. Вы можете использоватьgcloud
создать его для вас или использовать любой другой способ, описанный в разделе «Программная аутентификация» .
Я предполагаю, что у вас есть gcloud, поэтому я покажу вам, как его использовать:
- Войти с помощью учетной записи сервиса
gcloud auth activate-service-account --key-file service-account-key.json
- Отправить запрос
curl -H "Authorization: Bearer $(gcloud auth print-identity-token --audiences="xxx.apps.googleusercontent.com")" https://myapp.com/get_pics/1
Убедитесь, что вы предоставили сервисному аккаунту права
iap.httpsResourceAccessor
-разрешение, иначе вам все равно будет отказано.
- Бонус: не используйте файлы ключей служебной учетной записи. Выдайте себя за учетную запись службы из вашего текущего профиля пользователя.
curl -H "Authorization: Bearer $(gcloud auth print-identity-token --include-email --audiences="xxx.apps.googleusercontent.com" --impersonate-service-account=service_account@project.iam.gserviceaccount.com)" https://myapp.com/get_pics/1
Я не могу понять, как получить токен носителя от GCP, который я могу использовать в заголовке авторизации для cURL.
Согласно публичной документации Google
Если ваше приложение занимает заголовок запроса авторизации, вы можете вместо этого включить токен идентификатора в заголовок Proxy-Authorization: Bearer. Если в заголовке Proxy-Authorization обнаружен действительный токен идентификатора, IAP авторизует запрос с его помощью. После авторизации запроса IAP передает заголовок авторизации вашему приложению без обработки содержимого.
Если в заголовке Proxy-Authorization не найден действительный токен идентификатора, IAP продолжает обрабатывать заголовок Authorization и удаляет заголовок Proxy-Authorization перед передачей запроса вашему приложению.
Токен на предъявителя OIDC
Этот документ также включает примеры кода для:
- Получите токен OIDC для учетной записи службы по умолчанию .
- Получение токена OIDC из файла ключей локальной учетной записи службы
- Получение токена OIDC во всех остальных случаях.
По этой ссылке вы можете найти дополнительную информацию о проверке токена на предъявителя в GCP.
Аутентификация токена носителя
После некоторых исследований я нашел две страницы, на которых описывается, как обеспечить аутентификацию вашей учетной записи службы в виде токена на предъявителя и как отправить запрос Curl POST с заголовком авторизации токена на предъявителя.
Первый из них является частью общедоступной документации разработчиков Google и описывает процесс получения токена на предъявителя с помощью вашей учетной записи службы.
Выполните аутентификацию в своей учетной записи службы. В следующей команде замените
${KEY_FILE}
с путем к файлу ключей вашей сервисной учетной записи:gcloud auth activate-service-account --key-file ${KEY_FILE}
Используйте свою учетную запись службы для получения токена авторизации:
gcloud auth print-access-token
Команда возвращает значение токена доступа.
Когда вы используете API, передайте значение токена как токен носителя в заголовке авторизации. См. следующий пример:
curl -X GET -H "X-Goog-User-Project: ${CLIENT_PROJECT}" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ "https://sasportal.googleapis.com/v1alpha1/customers"
Набор
${CLIENT_PROJECT}
к идентификатору проекта Google Cloud , из которого вы делаете запросы, а затем установите${TOKEN}
к токену авторизации.
По этой ссылке вы найдете информацию и примеры запроса Curl с заголовком авторизации токена на предъявителя.