首页 > 解决方案 > 从 AppEngine 到 Cloud Function 的服务帐号身份

问题描述

我有一个私有 HTTP Google Cloud 函数,我想从另一个项目中的 AppEngine 应用程序调用它。

理想情况下,AppEngine 服务帐户将roles/cloudfunctions.invoker在我的 Cloud Function 上具有,我将关闭所有其他调用程序,并且我根本不必担心 CF 内部的身份验证。我正在努力让 AppEngine 身份传递下去。

Google 的文档展示了如何从一个 Cloud Function 到另一个 Cloud Function,但 AppEngine 使用自己的身份库来简化获取访问令牌的过程。AppEngine 文档概述:

有什么方法可以包含 AppEngine 身份,以便 Google 的本机 Cloud Functioninvoker角色将请求通过?

标签: google-app-enginejwtgoogle-cloud-functionsgoogle-iam

解决方案


对于这种情况,您需要自己以编程方式进行身份验证。

首先,您需要将应用引擎服务帐户添加到 Cloud Functions 权限。

之后,您需要按照这种情况的步骤操作。基本上,您需要创建一个 JWT,对其进行授权,然后将 JWT 包含在您的请求中。 您可以在此处找到用于创建和授权 JWT 的代码示例。

我已经在 python 中重现了你的情况。我使用了我发送给你的链接中的代码,然后在我的 JWT 正常之后,我提出了这样的请求:

@app.route('/')
def index():
  data = {'headers':      request.headers,
        'service_name': os.environ.get('GAE_SERVICE', '(running locally)'),
        'environment':  os.environ}
  return render_template('index.html', data=data)

@app.route('/request')
  def send_request():
     import requests
     receiving_function_url = 'YOUR-CLOUD-FUNCT-URL'
     r=requests.get("http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?audience="+receiving_function_url,
                headers={'Metadata-Flavor': 'Google'})

     response = make_iap_request('YOUR-CLOUD-FUNCTION-URL', 'YOUR-CLOUD-FUNCTION-URL')

     print(response)

     return response




if __name__ == '__main__':
app.run('127.0.0.1', port=8080, debug=True)

您需要的依赖项,在 requirements.txt 中:

flask
PyJWT==1.7.1
cryptography==2.7
google-auth==1.6.3
gunicorn==19.9.0
requests==2.22.0
requests_toolbelt==0.9.1

在这个存储库中,您可以找到更多关于如何执行 IAP(身份识别代理)请求的代码示例。


推荐阅读