使用API​​和服务帐户JSON文件从Google Container Registry中读取

时间:2019-05-14 10:22:07

标签: docker google-cloud-platform google-container-registry

从以前使用我们自己的内部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密钥文件。但是,我在网上可以找到的所有说明都告诉我如何在安装了gclouddocker的情况下使用它。甚至使用客户端库的步骤在文档和说明上都非常薄弱,以至于我无法取得进展。

我的应用程序不需要其他工具的复杂性,我只想以与公共注册表相同的方式发送HTTP请求。我希望JSON访问密钥文件包含我需要的所有内容,即使首先与Google进行礼节性交流也是如此。我找不到有关如何使用内容的任何信息。这在任何地方都有记录吗?

2 个答案:

答案 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。

  • 如何从Json文件加载服务帐户凭据。
  • 如何提取用于签署请求的私钥。
  • 如何为Google Oauth 2.0创建JWT(Json Web令牌)。
  • 如何设置Google范围(权限)。
  • 如何对JWT进行签名以创建Signed-JWT(JWS)。
  • 如何将Signed-JWT交换为Google OAuth 2.0访问令牌。
  • 如何设置到期时间。该程序默认为3600秒(1小时)。
  • 如何调用Google 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