Получить токен авторизации учетной записи службы без gcloud?

Возможно ли получить токен-носитель авторизации для учетной записи службы Google Cloud без использования gcloud?

То есть, я хотел бы сделать HTTP-запрос (предположительно подписанный каким-то образом моим ключевым файлом JSON), который предоставил бы мне эквивалент

gcloud auth application-default print-access-token

Этот запрос будет сделан на моем собственном сервере, где я, возможно, не gcloud установить gcloud и где у меня нет доступа к каким-либо внутренним метаданным сервера, которые могут это предоставить (например, как в случае с Compute Engine).

Есть ли какая-то конечная точка oauth, которая обеспечивает что-то вроде этого?

Альтернативно, есть ли способ генерировать долгоживущие токены с gcloud?

Я новичок в экосистеме Google Cloud, поэтому извините мое невежество и терминологию...

Ответ 1

Я думаю, что это именно то, что вы ищете:

https://developers.google.com/identity/protocols/OAuth2#serviceaccount

Честно говоря, я не думаю, что то, что вы пытались достичь, было правильно, работает

gcloud auth application-default print-access-token

вы получаете токен, который не предназначен для выполнения того, что вы искали:

"Эта команда полезна при разработке кода, который обычно использует учетную запись службы, но должен запускать код в локальной среде разработки, где проще предоставить учетные данные пользователя".

Это должно помочь вам в реализации этого решения:https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Ответ 2

Для вашего второго вопроса: "Есть ли способ генерировать долгоживущие токены с gcloud?", Нет, нет. Тем не менее, вы можете использовать токен обновления для генерации новых токенов доступа. Проверьте первый ответ на этот вопрос:

OAuth2 и API Google: срок действия токена доступа?

Кроме того, heres представляет собой пример библиотеки python, которую вы можете использовать в качестве механизма аутентификации:

https://github.com/GoogleCloudPlatform/google-auth-library-python/blob/master/google/oauth2/credentials.py

Ответ 3

Вот как это выглядит на Голанге:

import(
    "google.golang.org/api/compute/v1"
    "google.golang.org/api/container/v1"
    "google.golang.org/api/iterator"
    "google.golang.org/api/option"
    "google.golang.org/api/transport"
)
ctx := context.Background()
creds, err := transport.Creds(ctx, option.WithScopes(compute.CloudPlatformScope))
token, err := creds.TokenSource.Token()

Ответ 4

Нет необходимости в библиотеке или API. Вы можете получить его, используя

curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google" | jq -r .access_token

Это полезно, если вам это нужно в сценарии оболочки.