从以前使用我们自己的内部Docker Registry托管图像开始,我们已经开始迁移到Google Container Registry。作为此过程的一部分,我正在创建一个应用程序,该应用程序可以查询注册表中的可用标签并返回结果列表。对于公共注册表,这是微不足道的。我只是向HTTP发送HTTP请求,此处用curl
进行了演示:
curl https://example.docker.registry/v2/myapp/tags/list
只要我先进行身份验证,这在GCR的命令行中也可以使用:
curl -u "oauth2accesstoken:`gcloud auth print-access-token`" https://eu.gcr.io/v2/myproject/myapp/tags/list
我想以编程方式精确地做到这一点,并且我遵循了许多Google页面中的有关创建GCP服务帐户密钥的要求,例如:https://cloud.google.com/iam/docs/creating-managing-service-account-keys
我现在拥有一个已获得必需权限的服务帐户,并且我已经为该服务帐户创建了一个JSON密钥文件。但是,我在网上可以找到的所有说明都告诉我如何在安装了gcloud
或docker
的情况下使用它。甚至使用客户端库的步骤在文档和说明上都非常薄弱,以至于我无法取得进展。
我的应用程序不需要其他工具的复杂性,我只想以与公共注册表相同的方式发送HTTP请求。我希望JSON访问密钥文件包含我需要的所有内容,即使首先与Google进行礼节性交流也是如此。我找不到有关如何使用内容的任何信息。这在任何地方都有记录吗?
答案 0 :(得分:0)
我的应用程序不需要其他工具的复杂性,我只想 以与公共注册表相同的方式发送HTTP请求。 我希望JSON访问密钥文件包含我需要的所有片段, 即使首先与Google进行了仪式交流。我找不到 有关如何使用内容的信息。这在任何地方都有记录吗?
Google在任何地方都没有真正记录从服务帐户JSON文件到OAuth访问令牌的步骤。问题在于OAuth的范围很广,并且有许多功能和实现细节。我们通过研究库中的源代码来学习如何做到这一点。
我写了一篇文章,详细介绍了该文章,其中包括有效的Python代码。本文包含一个进行REST API调用的示例。我网站上的其他文章还包括使用OAuth访问令牌进行REST API调用的示例。
Google Cloud – Creating OAuth Access Tokens for REST API Calls
乍看之下,这个过程似乎很复杂,但是一旦掌握了一切,就很容易理解。
我的文章介绍了如何执行以下步骤,从JSON到OAuth令牌再到REST API。
答案 1 :(得分:0)
我知道这个问题有点老了,但是由于它是我自己搜索的主题,因此我想在此提供解决方法。
我已经创建了一个完整的Python application to inspect tags,所以您可能对此也很感兴趣,但是我将尝试在此处描述相关部分。
在我的测试中,GCR API接受了我所有的调用的Bearer令牌(可以由命令gcloud auth print-access-token
提供)。但是,有可能,这就是我选择的,专门从GCR API获得另一个短期访问令牌。奇怪的是,即使来自GCR API的Www-Authenticate
挑战想要一个Bearer令牌,您也可以使用基本身份验证来检索访问令牌。您还需要提供范围和服务作为查询参数。因此,将所有内容汇总在一起,您将根据以下curl
调用发出一个请求:
curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer <token>" \
https://gcr.io/v2/token?scope=repository:<myorg>/<myimage>:pull&service=gcr.io
或带有-u <name>:<password>
的基本身份验证版本。 JSON响应包含一个"token"
密钥,您可以将其值存储并用于以下所有请求。
您可以使用新的access-token
以类似的方式获得标签列表:
curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--header "Authorization: Bearer <access-token>" \
https://gcr.io/v2/<myorg>/<myimage>/tags/list
请注意,回复可能是分页的。
当我运行Python程序检查标记时,我只需通过标准输入(例如,
)将OAuth2令牌传递给它gcloud auth print-access-token | tag-spy ...
我发现我在this blog post中回答的大多数问题都令作者感到很赞。
P.S .:您还可以设置一个编码标头,该标头可以帮助处理大型JSON响应(Accept-Encoding: gzip, deflate
。