Firebase 3.0 Tokens : [Error: Firebase Auth ID token has no "kid" claim]

Firebase 3.0 Tokens : [Error: Firebase Auth ID token has no "kid" claim]

我目前正在使用 firebase 3.0 开发一项 node.js 服务,该服务由使用 firebase 2.4 的 Web 应用程序调用。

我在 header 调用中发送当前用户 Firebase ID token (Auth.$getAuth().token) 并尝试使用

验证此令牌
var idToken = req.headers["x-access-token"];
auth.verifyIdToken(idToken).then(function(decodedToken) {
    var uid = decodedToken.sub;
    console.log(decodedToken);
}, function(error){
    console.log(error);
});

但我得到:

[Error: Firebase Auth ID token has no "kid" claim]

getAuth():


更新

我刚刚测试了在服务器端生成和验证令牌,我遇到了同样的问题。

var auth = firebase.auth();
var token = auth.createCustomToken(userId, {"premium_account": true});
console.log(token);
auth.verifyIdToken(token).then(function(decodedToken) {
     console.log(decodedToken);
}, function(error){
     console.log(error);
});

有什么建议吗?


更新 2:[解决方案]

我的问题是 AngularFire 2.X.X 生成的令牌与服务器中 运行 的 Firebase 3.X.X 不兼容。因此,在深入了解人们在这里和 this google group topic the workaround was to use jsonwebtoken 中写下的一些想法后,如下所示:

var jwt = require('jsonwebtoken');
jwt.verify(idToken, fbKey, function(err, decoded) {
   if (!err){ console.log(decoded); }
});

您可以找到 fbKey 访问新的 firebase 控制台并进入 设置 -> 项目设置 -> 数据库

似乎无法同时使用 firebase 的 createCustomToken 和 verifyIdToken。

方法 createCustomToken 使用 jsonwebtoken 模块中的方法 sign,默认情况下不会将 "kid" 声明放入 jwt 的 header 部分。 而createCustomToken本身并没有放

我想这时候你可以直接使用 jsonwebtoken 模块来生成带有自己密钥 ID 的令牌。

firebase@3.0.2

--jsonwebtoken@5.7.0

您传递给服务器的令牌不是 JWT 令牌,verifyIdToken 需要 JWT 令牌。

在您的网络应用程序中获取 JWT 令牌, 运行 firebase.app().auth().currentUser.getToken().

我个人删除了 angularfire,在我看来,基本的 firebase 框架使 angularfire 变得毫无用处。另外,angularfire的firebase 3.0兼容版本还没有发布,可能在the next week according to the firebase team.

文档指出 Firebase ID 令牌与自定义令牌不同,并且 verifyIdToken() 不适用于验证使用 generateCustomToken() 生成的令牌。

旧式自定义令牌似乎仍然有效(使用数据库机密而不是服务帐户私钥签名)。您可以使用 firebase-token-generator.js and/or jsonwebtoken.js.

自己生成和验证这些

从 Firebase 项目 > 设置 > 数据库 > 机密复制

Create custom database authentication tokens using a legacy Firebase token generator. At least one secret must exist at all times.