google-app-engine - 从 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
角色将请求通过?
解决方案
对于这种情况,您需要自己以编程方式进行身份验证。
首先,您需要将应用引擎服务帐户添加到 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(身份识别代理)请求的代码示例。
推荐阅读
- javascript - Sequelize string 不是函数错误,为什么?
- twilio - 如何使用 Twilio 连接 2 个应用程序用户之间的通话并进行录音?
- django - 如何使用 django 形式的小部件调用 javascript 函数
- python - 如何应用 django 初始迁移?
- ios - 如果在 dealloc 之前没有移除 KVO 观察者,为什么应用程序会崩溃?
- javascript - 从数组中获取具有唯一 ID 的第一个对象并将它们放入新列表中
- mysql - 如何在 hostgator 上上传 nodejs 项目/网站。可能吗?
- multithreading - 如何在 groovy 中使用多线程访问 1000 个端点?
- google-cloud-platform - 扳手 - 如何查找表大小
- google-chrome-extension - 如何从后台脚本更改 BadgeText