【问题标题】:Firebase Cloud Function HTTP Request AuthorizationFirebase Cloud Function HTTP 请求授权
【发布时间】:2025-02-18 15:20:02
【问题描述】:

我有一个场景,我需要使用 HTTP 请求从外部服务器安全地请求 Firebase Cloud Function。为了请求它,我需要在授权标头上发送一个不记名 JWT 令牌。在查看了 Firebase/GCP 的 Google 文档后,我发现了许多不同的方法来使用 google 不同的 API 进行身份验证,但我有点迷失了。

我知道我需要使用服务帐户来识别调用通用人类用户凭据的机器。我还知道服务帐户提供了一个 JSON 文件,其中包含用于识别该服务帐户的安全信息,例如私钥。通过查看不同的文档,我发现this one 解释了如何生成和请求令牌。执行完这些步骤后,当我尝试使用生成的令牌调用云函数时,我面临 403 状态。

我仔细检查了我的服务帐户所具有的角色,并且确实拥有文档指出的角色。

有没有人知道或有任何建议如何继续通过机器(而非人类)交互进行云功能授权调用。

编辑 1:

根据此处的要求,我将发布我的 JWT 生成器代码:

const {
  private_key_id,
  private_key,
  client_email,
} = require('./serviceAccount.json');

const jwt = require('jsonwebtoken');

const payload = {
  "kid": private_key_id,
  "iss": client_email,
  "sub": client_email,
  "iat": 1611257400,
  "exp": 1611260940,
  "aud": "https://oauth2.googleapis.com/token",
  "target_audience": "https://<project- region>.cloudfunctions.net/helloWorld"
};

const token = jwt.sign(payload, private_key, { algorithm: 'RS256', header: {"alg":"RS256","typ":"JWT"} });

console.log(token);

使用上面的结果令牌,我向https://oauth2.googleapis.com/token 发送一个 POST 请求,其中令牌作为表单数据的断言字段发送。

在这里提出建议后,我做了一些研究,发现this blog 带有使用我的服务帐户生成身份令牌的说明。于是我跑了:

# Load the service account identity
gcloud auth activate-service-account --key-file=key.json
# Generate an id token
gcloud auth print-identity-token

生成的令牌给了我相同的结果 403 - Forbidden 错误。有趣的是,使用我的用户凭据并使用 gcloud 生成身份令牌,我能够请求 Cloud 函数,结果为 200。

我认为我的服务帐户配置缺少某种角色/特权/范围。

【问题讨论】:

  • Google OAuth(用户和服务帐户)可以生成三种类型的令牌。访问、身份和刷新。您可能正在生成第一个:访问令牌。诸如 Functions 之类的 Google 服务使用身份令牌对客户端进行身份验证。您在 Authorization: Bearer &lt;TOKEN&gt; 的 HTTP 请求标头中使用的是哪一个?
  • 同意约翰,你应该用错一个。你能分享你的代码来帮助你更多吗?
  • 感谢您的回复。我用新信息更新了问题。
  • 分配给您的服务帐户的具体角色和范围是什么?是否至少分配了cloudfunctions.functions.invoke 权限?
  • 谢谢大家。将 cloudfunctions.functions.invoke 添加到服务帐户后,我能够解决问题。

标签: firebase google-cloud-platform google-cloud-functions


【解决方案1】:

确保服务帐户已分配cloudfunctions.functions.invoke,以保证可以使用HTTP请求从外部服务器触发云功能。

【讨论】: