Как получить доступ к реестру Google Cloud Docker из Python

Я хочу получить список изображений из реестра Google Cloud Docker с помощью https://gcr.io/ http API.

Я нашел способ сделать это из командной строки следующим образом:

curl -u _token:$(gcloud auth print-access-token) https://gcr.io/v2/{project}/{repo}/tags/list

Но я хочу сделать это программно в Python. Вот что я попробовал до сих пор:

Ниже работает, но я не могу найти способ получить токен аутентификации без вызова gcloud shell cmd.

import requests
import subprocess

command = "gcloud auth print-access-token"
pswd= subprocess.check_output(command, shell=True).decode().strip()

repo = "repo"
project = "myproject"
user = "_token"
url = "https://gcr.io/v2/{project}/{repo}/tags/list".format(project=project, repo=repo)
r = requests.get(url, auth=(user, pswd))
print (r.status_code, r.headers['content-type'], r.encoding, r.text)

Кроме того, я также попытался выполнить запрос с использованием аутентифицированного httplib2:

import httplib2
from oauth2client.client import GoogleCredentials
http = httplib2.Http()
credentials = GoogleCredentials.get_application_default()

scopes = "https://www.googleapis.com/auth/cloud-platform"

credentials = credentials.create_scoped(scopes)

http = credentials.authorize(http)
print (http.request("https://gcr.io/v2/healthshield-dev/dl/tags/list"))

Результат b'{"errors":[{"code":"UNAUTHORIZED","message":"Not Authorized."}]}'

Кто-нибудь может поделиться со мной своим опытом в этом?

1 ответ

Я смог сделать то, что вам нужно сделать здесь, но в Java, должно быть довольно просто перевести на Python. Вот что я сделал:

  1. Используйте клиентскую библиотеку API Google OAuth2 для Java ( https://developers.google.com/identity/protocols/OAuth2ServiceAccount), чтобы получить токен, используемый для аутентификации для запроса gcr.io/v2. В разделе "Другое" я использовал настройку jsonKeyFile для учетной записи службы.

Клиентская библиотека Python -> https://developers.google.com/api-client-library/python/guide/aaa_oauth

        GoogleCredential credential = GoogleCredential.fromStream(keyFileInputStream).createScoped(Collections.singleton(ContainerScopes.CLOUD_PLATFORM));

        credential.refreshToken();
        String token = credential.getAccessToken();
  1. Теперь с токеном, просто сделайте запрос GET к https://gcr.io/v2/xxxx/tags/list

Обратите внимание, что с помощью curl -u вы передаете учетные данные в виде _token:value, поэтому вам нужно будет закодировать их в заголовок обычной аутентификации, который вам нужно будет указать в запросе. Вот что я сделал (вроде):

String encoding = Base64Encoder.encode("_token:"+token);
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Basic " + encoding);

Надеюсь это поможет.

Другие вопросы по тегам