验证node.js服务器上的客户端Firebase令牌

时间:2013-09-18 04:24:52

标签: node.js firebase

我正在使用express.js实现一个node.js服务器用于REST和Firebase进行数据存储。

我已阅读Using NodeJs with Firebase - Security,它可以通过这种方式实现,但在我的情况下,我需要向服务器发送数据,服务器必须返回重定向地址,因此使用firebase作为通信通道有点复杂

我目前正在通过发送Firebase身份验证令牌作为查询参数并使用firebase auth()方法检查授权来验证服务器上的客户端身份。

dataRef.auth(CLIENT_TOKEN, function(error) {
  if(error) {
    console.log("Login Failed!", error);
  } else {
    console.log("Login Succeeded!");
  }
}); 

问题是,在服务器中我还需要firebase“admin”权限。为此,我需要使用管理令牌使用firebase auth()再次进行身份验证。 (由firebase-token-generator生成)

var FirebaseTokenGenerator = require("firebase-token-generator");
var tokenGenerator = new FirebaseTokenGenerator(YOUR_FIREBASE_SECRET);
var token = tokenGenerator.createToken({some: "arbitrary", data: "here"});

我注意到auth()方法存在限制:

  

请注意,对Firebase的所有引用都具有相同的身份验证状态。因此,如果您两次调用新的Firebase()并在其中一个上调用auth(),则会对它们进行身份验证。

有没有办法在不调用auth()两次的情况下实现它?

或者有更好的解决方案吗?

1 个答案:

答案 0 :(得分:12)

根据评论和实施后,似乎最好的解决方案是使用通用JWT库,例如: https://github.com/hokaccha/node-jwt-simple

在库的帮助下,您可以使用firebase密码解码令牌:

// decode
var decoded = jwt.decode(token, secret);
console.log(decoded); //=> {"v":0,"iat":1359943067,"d":{"id":"user@fb,com"}}

解码后的令牌包含iat(发布于),可能包含exp(过期)。如果未提供exp,则firebase令牌的默认到期时间为24小时。您需要检查令牌是否已过期。

更多详情: https://www.firebase.com/docs/security/custom-login.html