从AppEngine到Cloud Function的服务帐户身份

时间:2019-10-17 19:35:25

标签: google-app-engine jwt google-cloud-functions google-iam

我有一个私有的HTTP Google Cloud Function,我想从另一个项目的AppEngine应用中调用。

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

Google's docs显示了如何从一个Cloud Function到另一个Cloud Function,但是AppEngine却使用其自己的identity library来简化获取访问令牌的过程。 AppEngine文档概述:

以任何方式包含AppEngine身份,以使请求通过Google的本地Cloud Function invoker角色吗?

1 个答案:

答案 0 :(得分:0)

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

首先,您需要将App Engine服务帐户添加到Cloud Functions权限。

之后,您需要按照Get pixel value from CVPixelBufferRef in Swift的步骤进行操作。基本上,您将需要创建一个JWT,对其进行授权,然后将JWT包含在您的请求中。 this situation可以找到用于创建和授权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

在此Here中,您可以找到有关如何执行IAP(身份识别代理)请求的更多代码示例。