firebase - 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。
我在想我的服务帐户配置缺少某种角色/特权/范围。
解决方案
确保服务帐户已分配cloudfunctions.functions.invoke,以保证可以使用 HTTP 请求从外部服务器触发 Cloud Function。
推荐阅读
- git - 在 Git 中,当我将本地分支推送到远程时,如何将它们配置为具有前缀?
- python - 无法在 twitchio 中正确设置 initial_channels
- git - Git - 忽略对已在存储库中的文件的更改
- elastic-stack - 在自定义 Kibana 插件中使用 URL 参数
- matlab - 0 Hz 时的 Matlab FFT 峰值,无偏移
- c++ - 不知道我的高斯滤波器出了什么问题
- regex - 获取括号之间的多个值
- c++ - 仅在使用 snapcraft VM 时生成错误“ISO C++ 禁止零大小数组 'f_handle' [-Wpedantic]”
- jquery - 从 .js 文件中的静态加载图像时出现问题
- sql - 查找超过指定天数的任何人的最大连续缺勤天数