问题描述
我在验证来自 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 (将#修改为@)