如何在后端验证firebase管理员

时间:2018-06-06 04:08:58

标签: node.js firebase express firebase-authentication firebase-admin

我正在尝试在快速服务器中实现中间件,该服务器在传入请求上设置自定义uid / admin标头。然后,在中间件之后使用此修改后的请求,以查看经过身份验证的用户/管理员是否正在访问该特定资源。

要为客户端执行此操作,我只需获取Authorization标头上的令牌并将其提供给firebase admin api的verifyIdToken方法。如果存在uid,我设置标题。例如:

app.use((req, res, next) => {
  /* get rid of headers sent in by malicious users. */
  delete req.headers._uid;
  try {
    const token = req.headers.authorization.split(' ')[1];
    _dps.fb_admin.auth().verifyIdToken(token).then(claims => {
      if (claims.uid) { req.headers._uid = claims.uid; }
      next();
    }).catch(err => next());
  } catch(err) { next(); }
});

两个问题:

1)作为在另一台服务器上拥有服务帐户的管理员,我如何向该服务器发送请求,以便该服务器可以确定管理员发送了该请求?

2)我如何识别此服务器上的管理员?

3 个答案:

答案 0 :(得分:0)

  1. 您需要创建自己的自定义Firebase令牌,以在JWT中包含isAdmin: true等自定义字段。请参阅https://firebase.google.com/docs/auth/admin/create-custom-tokens

  2. 见(1)

答案 1 :(得分:0)

使用setCustomUserClaims() API向所有管理员用户帐户添加特殊的“管理员”声明,并在验证ID令牌时进行检查。你可以找到这个用例here的讨论和演示(跳到录音的6:45标记)。

答案 2 :(得分:0)

也许解决方案是简单地生成一个体面长度的API密钥,并将其设置为每个服务器上的环境变量。然后我可以在Authorization标头中发送它,只要我想发一个admin https请求,并通过一个简单的字符串比较在接收器的中间件中验证它。唯一可以看到此API密钥的人是可以访问我的服务器的人(AKA管理员)。如果这种方法有问题,请告诉我。这看起来很简单。