首页 > 解决方案 > Firebase Cloud Function HTTP 请求授权

问题描述

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

我知道我需要使用服务帐户来识别调用通用人类用户凭据的机器。我还知道服务帐户提供了一个 JSON 文件,其中包含用于识别该服务帐户的安全信息,例如私钥。通过查看不同的文档,我找到解释如何生成和请求令牌的文档。执行完这些步骤后,当我尝试使用生成的令牌调用云函数时,我面临 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 请求,其中令牌作为表单数据的断言字段发送。

在这里提出建议后,我做了一些研究,发现这个博客有使用我的服务帐户生成身份令牌的说明。所以我跑了:

# 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。

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

标签: firebasegoogle-cloud-platformgoogle-cloud-functions

解决方案


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


推荐阅读