我正在尝试从 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())
问得好。
请参阅验证用户身份。
在这种情况下,您对使用
gcloud
和服务帐户的要求的担忧是正确的;当您知道您的用户(例如组织用户)拥有
gcloud
时,使用 gcloud
是一个好方法。
当您有独立运行的非人类用户(例如某些软件)时,应使用服务帐户。您永远不想分发服务帐户密钥。
人类用户有 2 个主要解决方案:
使用这种方法,Google Identity 或 Firebase Auth 将为经过身份验证(并且可能是授权)的用户生成身份令牌,然后这些用户将被允许调用您的 (Cloud Run) FastAPI 服务。