使用服务帐户对在 Google Cloud Run in Python 中运行的 API 进行身份验证

问题描述 投票:0回答:1

我正在尝试从 Google Cloud 项目外部连接到 Fast API(在 Google Cloud Run 中运行)。为此,我创建了一个具有 Cloud Run Invoker 角色的服务帐户(使用 IAM)。

现在我正在尝试对 API 进行 REST 调用。 我以某种方式让它工作了。但我对这个解决方案并不满意。

有没有办法可以避免使用 gcloud 命令并在 python 中完成整个操作而无需默认登录? 我想避免使用 gcloud 设置服务帐户凭据并使用默认登录名访问它,因为该 API 将被其他人使用,并且应该只需最少的努力就可以开始使用。安装和设置 gcloud 则不然。 任何类型的提示将不胜感激。

我下载了服务帐户凭据信息文件 (key.json)。 我使用以下命令激活服务帐户:

gcloud auth activate-service-account caller-sa@api_proj.iam.gserviceaccount.com --key-file=./key.json --project=api_proj

然后我使用了以下代码:

import google.auth
import google.auth.transport.requests
from google.auth.transport.requests import Request
import google.oauth2.id_token
import requests
import google.oauth2.credentials

service_account_file = "./key.json"

credentials, project_id = google.auth.default()

request = Request()
credentials.refresh(request)
id_token = credentials.id_token

headers = {"Authorization": f"Bearer {id_token}"}

url = "https://api-proj.europe-west3.run.app/predict"
data = """ Mi chiamo Pietro. Sono di Roma."""
response = requests.post(url=url, headers=headers, json={"data": data})
response.raise_for_status()
print(response.json())
rest google-oauth google-cloud-run
1个回答
0
投票

问得好。

请参阅验证用户身份

在这种情况下,您对使用

gcloud
和服务帐户的要求的担忧是正确的;当您
知道
您的用户(例如组织用户)拥有 gcloud时,使用
gcloud
是一个好方法。

当您有独立运行的非人类用户(例如某些软件)时,应使用服务帐户。您永远不想分发服务帐户密钥。

人类用户有 2 个主要解决方案:

  1. 您可以使用 Google Cloud 项目 (IAM) 用户,但这需要您提前了解这些用户,将他们添加到您的项目等。此方法最适合组织内的内部用户。
  2. 对于“客户”以及具有某种形式的开放式用户群的情况以及可能遵循某些用户驱动或您驱动的注册流程的用户,Google 提供了上面链接中概述的解决方案:Google Identity 或 Firebase Auth。在这些方法下,您可以支持联合身份(Google、Microsoft、Facebook、Apple 等),保留限制谁可以访问您的解决方案所需的控制但是,但需要额外的工作(如链接中所述)。

使用这种方法,Google Identity 或 Firebase Auth 将为经过身份验证(并且可能是授权)的用户生成身份令牌,然后这些用户将被允许调用您的 (Cloud Run) FastAPI 服务。

© www.soinside.com 2019 - 2024. All rights reserved.