验证*来自* Firebase 云函数到自定义节点服务器

问题描述

我在验证来自 Firebase Cloud Functions 到自定义节点服务器时遇到问题。

背景:

我使用自定义节点 + 快速服务器来接收来自我们网站的经过身份验证的客户端的调用。我可以使用这样的方法成功验证他们的令牌:

const bearerHeader = req.headers['authorization'];
const bearerToken = bearerHeader.split(' ')[1];
await admin.auth().verifyIdToken( bearerToken );

我现在需要什么:

我需要从 Cloud Function(而不是经过身份验证的 Web 客户端)调用此端点之一。

所以,在我调用云函数上:

const admin = require('firebase-admin');
      admin.initializeApp();  // regular initialization
const token = await admin.app().options.credential?.getAccesstoken();
const config = { headers: { Authorization: `Bearer ${token.id_token}` } };
await axios.post(url,body,config);

问题:

token.id_token 中缺少 getAccesstoken() 字段:

// token:
{
  access_token: 'ya29. ... ... ',expires_in: 3599,token_type: 'Bearer'
}

当使用其他凭据在本地运行时(例如,我在运行 firebase functions:shell 时的用户凭据,或将 GOOGLE_APPLICATION_CREDENTIALS 设置为服务帐户凭据文件时)时,我确实获得了一个额外的属性 id_token我可以用来进行身份验证。但是在 Cloud Function 上部署和运行时,id_token 属性为空。

有什么想法吗?

提前致谢。

PS:一个额外的问题......使用服务帐户的本地测试确实包括id_token,但是当对服务器进行身份验证时getAccesstoken()失败:

Firebase ID token has incorrect "aud" (audience) claim. Expected "<project-id>" but got "<some-hash>.apps.googleusercontent.com".

也许这两个问题的解决方法相同。但是服务器确实可以正常工作以验证来自网站的用户令牌。

编辑:

我不得不将 access_token 换成 id_token,为此我遵循了类似于 this内容projectId 作为受众。 现在的问题是关于发行者 (iss) 而不是受众 (aud):

Firebase ID token has incorrect "iss" (issuer) claim. Expected "https://securetoken.google.com/<project id>" but got "https://accounts.google.com".

我想我可以使用相同的库来验证服务器上的令牌,但是我的网络客户端会遇到相同的颁发者问题

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...