node.js - 如何验证最终用户身份验证令牌(使用 Firebase 身份验证)以调用谷歌云运行端点?
问题描述
请帮助最终用户使用 Firebase 身份验证在云运行中进行身份验证。
简短描述:我提交 Authorization: Bearer + idToken header from firebase function with idToken of authenticated with email/password firebase user user1。我将它提交到云运行实例,并为此user1设置了 Cloud Run Invoker 角色。但在云运行日志中,我看到以下错误:
该请求未被授权调用此服务。在https://cloud.google.com/run/docs/securing/authenticating了解更多信息
我究竟做错了什么?如何从经过身份验证的用户调用的 firebase 函数调用云运行端点调用?
更多细节:
我有一个带有电子邮件/密码 firebase 身份验证的简单 firebase 应用程序。当user1说 test@test.com 使用电子邮件/密码进行身份验证时,我使用 firebase.User.getIdToken() 为该用户获取 Id 令牌并将其提交给 firebase 函数。
在 firebase 功能方面,我提取用户令牌并将其作为 Authorization: Bearer + token header 提交到谷歌云运行端点:
export const getData = functions.https.onRequest(
async (req, response) => {
cors(req, response, async () => {
getToken(req)
.then(async (token: any) => {
const options = {
url: cloud_run.CLOUD_RUN_ENDPOINT,
headers: {
Authorization: `Bearer ${token}`,
},
};
request.get(options, async function (err, resp) {
//Processing the result
});
//etc
在谷歌云运行上,我已经部署了云运行端点。在云运行权限选项卡上,我为我的user1 test@test.com 设置了 Cloud Run Invoker 角色。
但是当我执行上述的firebase函数getData时,我在云运行日志中看到了以下错误:
2020-10-29 14:30:13.498 MSK GET 401 0 B 0 ms@root+request/1.6.1 node/v10.22.0 linux/4.4.0 Linux/x64 https://<cloud_run.CLOUD_RUN_ENDPOINT> 请求是无权调用此服务。在https://cloud.google.com/run/docs/securing/authenticating了解更多信息
根据本手册: https : //cloud.google.com/run/docs/authenticating/end-users 进行 Firebase 身份验证:https ://cloud.google.com/run/docs/authenticating/end-users#cicp- firebase 身份验证
我需要实施身份平台或 Firebase 身份验证(完成)并手动验证他们的凭据。如何手动验证凭据?提交不记名授权令牌后我该怎么办?
解决方案
为此,您有 2 个解决方案:
- 自行检查未经身份验证的 Cloud Run 服务中的令牌。最近有一篇关于此的很棒的 Google Cloud 帖子。就我个人而言,我不喜欢这种解决方案,因为如果发生攻击,则由您的服务来管理如此高的流量,而您需要付费!
- 使用代理。(旧的)Cloud Endpoint 可以实现这一点,我在1 年前写了一篇关于这个的文章(使用 API Keys 安全定义,但是用Firebase Auth 安全定义更改它并使用它!)。它已经很老了,因为今年夏天发布了一项名为API Gateway的全新服务,它今天是由 Google 完全管理的 Cloud Endpoint(今天功能相同,但 API Gateway 会发展;不确定 Cloud Endpoint!)
推荐阅读
- python - Python / TXT:在字符串之后复制文本的代码
- r - 计数观察之间的发生
- python - 无法在 Pycharm 中使用 Django 连接到 MongoDB
- php - 带有命名空间 PHP 的 SOAP Post 请求
- sql - 如何使用两个表进行 SQL 查询
- coordinates - xarray 获取非 NaN 变量值的最高坐标
- javascript - mongoose post init 挂钩中的并行保存错误。无法并行保存()同一个文档
- javascript - 代码错误-分割字符串并返回每个单词JS的长度
- docker - 在 Jenkinsfile 中运行 docker-compose up 会给我版本错误,而当我在服务器内部运行时它可以工作
- python - 根据时间戳小时删除 DataFrame 中的行