当前位置: 首页 > 知识库问答 >
问题:

无法从Google Container VM映像访问服务帐户的元数据令牌

司徒捷
2023-03-14

我从一个VM映像登录到一个Google Compute Engine实例,详见此处。

我想按照指示访问私有容器注册表,但在请求令牌时得到一个403错误。

尝试这个:

$ METADATA=http://metadata.google.internal/computeMetadata/v1
$ SVC_ACCT=$METADATA/instance/service-accounts/default
$ ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token \
    | cut -d'"' -f 4)
$ docker login -e 1234@5678.com -u _token -p $ACCESS_TOKEN https://gcr.io
$ docker run --rm gcr.io/<your-project>/<your-image> <command>

试图调用元数据时,我可以看到:

> curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/" -H "Metadata-Flavor: Google"

aliases
email
scopes
token

...但是当我试图获取令牌时,我出现了一个403错误:

> curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"

<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 403 (Forbidden)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
  </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>403.</b> <ins>That’s an error.</ins>
  <p>Your client does not have permission to get URL <code>/computeMetadata/v1/instance/service-accounts/default/token</code> from this server.  <ins>That’s all we know.</ins>

我已经将默认的compute engine服务帐户设置为项目的所有者(它在编辑器上),并再次尝试,但没有运气。

我已经尝试了以下详细的SO解决方案,它们不起作用:

  • 如何使用IAM将文件从google cloud instance上传到云存储?
  • 不使用gcloud客户端访问google容器注册表
  • GCloud docker push 403禁止

并在这里查阅了谷歌文档:

    null

在如何获得成功的身份验证方面,我是否遗漏了什么?如果你有任何建议,非常感谢!

共有1个答案

柴修筠
2023-03-14

感谢上帝,我在没有正确范围的情况下创建了实例。

您可以在edit instance屏幕中签入GCE UI,由于在API请求中传递{“https://www.googleapis.com/auth/cloud-platform”}而不是[“https://www.googleapis.com/auth/cloud-platform”],所以我没有Google API云访问权限。

该命令现在正确返回auth标记:

> curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" -H "Metadata-Flavor: Google"

{"access_token":"ya29.XXXXX","expires_in":3599,"token_type":"Bearer"}
 类似资料:
  • 我有一个G套件域,并用域范围的授权打开一个服务号。服务号在项目中也有所有者身份。我启用gmail应用编程接口并添加范围参考(https://developers.google.com/admin-sdk/directory/v1/guides/delegation“将域范围的权限委托给您的服务号”)我也启用不太安全的应用程序设置。 这是我的代码: 但是当我使用这个令牌尝试列出电子邮件时:GETht

  • 我已经成功地使用Google API(通过HTTP/REST,以及使用.NET客户端库)和Google服务帐户访问Google Drive中的文件。 最近,我正在探索融合表。我能够通过web应用程序使用具有用户授权的API。然而,当我尝试在同一个项目下使用Google服务帐户访问它时,它失败了,每当我https://www.googleapis.com/auth/fusiontables范围内:

  • 我的云功能,CF(使用服务帐户凭据,)在AppEngine上运行的应用程序(使用应用程序引擎默认服务帐户凭据,) api_请求引发异常中的文件“/env/local/lib/python3.7/site packages/google/cloud/_http.py”,第293行。来自谷歌的http响应(response)。api_核心。例外情况。禁止:403获得https://www.google

  • 我正在尝试使用Google Directory API验证组成员,但每次我发出请求时都无法通过403错误。 我使用的是一个服务帐户,我为它启用了“启用G套件域范围委托”选项。我还使用套件中的客户端ID添加了“https://www.googleapis.com/auth/admin.directory.user,https://www.googleapis.com/auth/admin.direc

  • 我无法从外部访问我的服务。首先,这里是我的conf yaml文件: nginx-pod.yaml nginx-service.yaml metallb-config.yaml 然后我创建了集群。命令 打印: 一切正常,而且< code > ku bectl describe service/nginx-service 打印: curl命令在主服务器打印。接下来我试图从另一个网络打开,它不起作用,但

  • 我想使用gsutil和服务帐户在命令行上访问Goolge播放报告。有一个云存储URI,格式为gs://bucket\u name,我可以用我的用户帐户列出和下载报告,但不能用我创建的服务帐户。错误总是相同的: 我已向服务帐户授予了所有必需的权限,因此我不明白为什么用户帐户可以使用,而服务帐户却无法使用。 所以如果你知道如何帮助我,我会非常感谢你。