如何使用 API Gateway 传递给 Cloud Function 的服务帐户的 JWT 在 Cloud Function 中初始化 Google BigQuery 客户端

dnnshssm

目标:
我已经设置了一个 Google API 网关。API 的后端是一个云函数(用 Python 编写)。云函数应从 Google BigQuery (BQ) 查询数据。为此,我想创建一个 BQ 客户端 ( google.cloud.bigquery.Client())。API 应该由使用不同服务帐户的不同应用程序访问。服务帐户仅有权访问我的项目中的特定数据集。因此,服务帐户/应用程序应该只能查询他们有权访问的数据集。因此,云函数中的 BQ Client 应使用向 API 发送请求的服务帐户进行初始化。

我的尝试:
API 使用以下 OpenAPI 定义进行保护,因此需要由服务帐户 SA-EMAIL 签名的 JWT 才能在那里发送请求:

securityDefinitions:
  sec-def1:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "SA-EMAIL"
    x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/SA-EMAIL"
    x-google-audiences: "SERVICE"

对于使用我的云功能的路径,我使用如下后端配置:

x-google-backend:
  address: https://PROJECT-ID.cloudfunctions.net/CLOUD-FUNCTION
  path_translation: CONSTANT_ADDRESS 

因此,在云函数本身中,我获得了转发的 JWTX-Forwarded-Authorization以及X-Apigateway-Api-Userinfo来自 API 网关的已验证 base64url 编码的 JWT 有效负载
我尝试使用 JWT fromX-Forwarded-Authorization来获取凭据:

bearer_token = request.headers.get('X-Forwarded-Authorization')
token = bearer_token.split(" ")[1]
cred = google.auth.credentials.Credentials(token)

起初,这似乎是工作以来cred.valid的回报True,而是试图以创建客户端时,google.cloud.bigquery.Client(credentials=cred)它会返回在日志中出现以下错误:

google.auth.exceptions.RefreshError: The credentials do not contain 
the necessary fields need to refresh the access token. You must 
specify refresh_token, token_uri, client_id, and client_secret.

我对 auth/oauth 没有太多经验,但我认为我没有必要的令牌/属性,错误表明我的云功能中缺少可用的令牌/属性。另外,我不确定为什么会有RefreshError,因为我不想刷新令牌(并且不要明确这样做)并再次使用它(可能是不好的做法?)。

问题:
是否有可能以我尝试过的方式或任何其他方式实现我的目标?

纪尧姆·布拉基埃

您的目标是捕获调用 API 网关的凭证,并在您的 Cloud Functions 中重用它来调用 BigQuery。

可悲的是,你不能。为什么?因为 API Gateway 阻止您实现这一目标(出于安全原因,这是一个好消息)。JWT 令牌已正确转发到您的 Cloud Functions,但签名部分已被删除(您仅收到 JWT 令牌的标头和正文)。

安全验证已由 API Gateway 完成,您必须依赖该身份验证。


解决办法是什么?

我的解决方案如下:在您收到的截断 JWT 中,您可以获取正文并获取服务帐户电子邮件。从那里,您可以使用 Cloud Functions 服务帐户来模拟您收到的服务帐户电子邮件。

这样,Cloud Functions 服务帐户只需要模拟这些服务帐户的权限,您保留原始服务帐户提供的权限。

我没有看到其他解决方案来解决您的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章