使用gcloud auth print-access-token
获取的访问令牌显然是一个不同于我可以通过一些基本python代码获得的访问令牌:
export GOOGLE_APPLICATION_CREDENTIALS=/the-credentials.json
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
credentials.get_access_token()
我要做的是获得一个可以使用的令牌:
curl -u _token:<mytoken> https://eu.gcr.io/v2/my-project/my-docker-image/tags/list
我不想安装gcloud实用程序作为我的应用程序的依赖项,因此我尝试通过誓言google凭据以编程方式获取访问令牌
答案 0 :(得分:2)
所以我认为有几个问题:
gcloud auth print-access-token
vs GoogleCredentials.get_application_default()
gcloud
时, gcloud auth login
不再默认设置应用程序默认凭据,因此您从gcloud auth print-access-token
获取的access_token将是与使用的对应的access_token你曾经登录过。
只要您按照instructions为服务帐户创建ADC,该帐户就有the necessary permissions,并且您执行该脚本的环境可以访问ENV var和adc .json文件,你应该没事。
如何让curl
工作
Docker Registry API指定发生令牌交换,将您的Basic身份验证(即Authorization: Basic base64(_token:<gcloud_access_token>)
)交换为短期承载令牌。这个过程可能有点涉及,但记录在案here under "How to authenticate" and "Requesting a Token"。将auth.docker.io/token
替换为eu.gcr.io/v2/token
,将service=registry.docker.io
替换为service=eu.gcr.io
等。在此使用curl -u oauth2accesstoken:<mytoken>
。
另请参阅:How to list images and tags from the gcr.io Docker Registry using the HTTP API?
完全避免这个问题
我们有一个可能与您的需求相关的python库: https://github.com/google/containerregistry
答案 1 :(得分:1)
我知道这是一个非常老的问题,但是我刚遇到the exact same problem of requiring an ACCESS_TOKEN in Python and not being able to generate it,并设法使其正常工作。
您需要执行的操作是使用变量credentials.token
,除了在您第一次创建凭证对象并返回None
后将不存在该变量。为了生成令牌,凭据必须由google.cloud库使用,在我的情况下,这是通过使用googleapiclient.discovery.build
方法完成的:
sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials)
response = sqladmin.instances().get(project=PROJECT_ID, instance=INSTANCE_ID).execute()
print(json.dumps(response))
之后,可以使用
正确生成ACCESS_TOKENaccess_token = credentials.token
我还使用google.cloud storage
作为测试凭据的一种方式对其进行了测试,它也可以通过尝试通过适当的Python库访问GCS中的存储桶来实现:
from google.oauth2 import service_account
from google.cloud import storage
PROJECT_ID = your_project_id_here
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
try:
list(storage.Client(project=PROJECT_ID, credentials=credentials).bucket('random_bucket').list_blobs())
except:
print("Failed because no bucket exists named 'random_bucket' in your project... but that doesn't matter, what matters is that the library tried to use the credentials and in doing so generated an access_token, which is what we're interested in right now")
access_token = credentials.token
print(access_token)