Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 如何在没有任何Google API绑定的情况下从GCE容器访问应用程序默认凭据?_Google Cloud Platform_Google Kubernetes Engine - Fatal编程技术网

Google cloud platform 如何在没有任何Google API绑定的情况下从GCE容器访问应用程序默认凭据?

Google cloud platform 如何在没有任何Google API绑定的情况下从GCE容器访问应用程序默认凭据?,google-cloud-platform,google-kubernetes-engine,Google Cloud Platform,Google Kubernetes Engine,我正在编写一个应用程序,它运行在一个容器中,在Google容器引擎上,使用一种与Google API没有任何绑定的语言 我需要访问应用程序默认凭据。不幸的是,官方文档没有解释如何在不使用现有的GoogleAPI绑定的情况下在生产环境中执行此操作 在开发环境中(即在本地开发机器上),我导出了GOOGLE_APPLICATION_CREDENTIALS变量,但它在生产容器中不可用。这是否意味着我必须使用RESTAPI中的某个端点?Ruby的实现是开源的,可以访问 按优先级检查的不同位置 该方法清楚地

我正在编写一个应用程序,它运行在一个容器中,在Google容器引擎上,使用一种与Google API没有任何绑定的语言

我需要访问应用程序默认凭据。不幸的是,官方文档没有解释如何在不使用现有的GoogleAPI绑定的情况下在生产环境中执行此操作


在开发环境中(即在本地开发机器上),我导出了GOOGLE_APPLICATION_CREDENTIALS变量,但它在生产容器中不可用。这是否意味着我必须使用RESTAPI中的某个端点?

Ruby的实现是开源的,可以访问

按优先级检查的不同位置 该方法清楚地表明:

  • 选中GOOGLE_应用程序_凭据环境变量
  • 然后检查路径
  • 然后检查默认路径
    /etc/google/auth
  • 最后,如果仍然为空,则在计算实例上,将获取一个新的访问令牌
  • def get_application_默认值(scope=nil,options={})
    creds=DefaultCredentials.from_env(范围)||
    DefaultCredentials.from_well_known_路径(范围)||
    DefaultCredentials.from_system_default_路径(作用域)
    退回信用卡,除非信用卡。零?
    除非gce上的GCECredentials.(选项),否则未发现raise错误
    GCECredentials.new
    结束
    
    这与上面所说的是一致的:

  • 已检查环境变量GOOGLE\u APPLICATION\u CREDENTIALS。如果 指定此变量时,它应指向定义 资格证书[……]

  • 如果您已在计算机上安装了Google Cloud SDK并已运行 命令gcloud auth application default login,您的身份可以 可以用作代理来测试从该计算机调用API的代码

  • 如果你 正在运行的谷歌应用引擎生产,内置服务 将使用与应用程序关联的帐户

  • 如果您运行的是谷歌计算引擎产品,那么内置服务 将使用与虚拟机实例关联的帐户

  • 如果这些条件都不成立,则会发生错误
  • 检测GCE环境 该方法显示了如何通过向发送GET/HEAD HTTP请求来检查我们是否在GCE上。如果响应中有一个
    元数据风格:Google
    头,那么它可能是GCE

    def on_gce?(选项={})
    c=选项[:连接]| |法拉第.default|u连接
    resp=c.get(COMPUTE_CHECK_URI)do|req|
    #注释来源:oauth2client/client.py
    #
    #注意:下面显式的'timeout'是一种解决方法。潜在的
    #问题是,解决某些网络上的未知主机将需要
    #20-30秒;缩短此超时可以解决此问题,但是
    #如果我们参加GCE考试,可能会导致误报,但是
    #元数据解析速度特别慢。后一种情况是
    #“不太可能”。
    req.options.timeout=0.1
    结束
    返回false,除非resp.status==200
    返回false,除非响应头.key('Metadata-Flavor')
    返回相应的标题['Metadata-FLANCE']=='Google'
    救援法拉第::超时错误,法拉第::连接失败
    返回错误
    结束
    
    直接从Google获取访问令牌 如果在文件系统上找不到默认凭据,并且应用程序正在GCE上运行,我们可以请求一个新的访问令牌,而无需事先进行任何身份验证。这是可能的,因为默认服务帐户是在项目中启用GCE时自动创建的

    该方法展示了如何从GCE实例中,通过向
    http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token

    def fetch_access_令牌(选项={})
    c=选项[:连接]| |法拉第.default|u连接
    c、 headers={'Metadata Flavor'=>'Google'}
    resp=c.get(COMPUTE\u AUTH\u TOKEN\u URI)
    案例响应状态
    当200
    Signet::OAuth2.parse_凭证(分别为主体、,
    响应头['content-type'])
    当404
    raise(Signet::AuthorizationError,无元数据\u服务器\u错误)
    其他的
    msg=“意外错误代码#{resp.status}”+意外错误后缀
    raise(签名::AuthorizationError,msg)
    结束
    结束
    
    下面是一个curl命令来说明:

    curl \
      http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token \
      -H 'accept: application/json' \
      -H 'Metadata-Flavor: Google'