【问题标题】:how to verify a firebase admin on backend如何在后端验证 Firebase 管理员
【发布时间】:2018-11-15 15:37:56
【问题描述】:

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

要为客户端执行此操作,我只需获取 Authorization 标头上的令牌并将其输入 firebase 管理 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) 我如何识别此服务器上的管理员?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这假设我想拥有具有管理员角色的帐户,但我没有。我正在寻找一种使用服务帐户的方法。这应该是可能的,因为我可以使用节点管理 api 写入 RTDB,并且 RTDB 知道它的管理员请求写入。
      【解决方案3】:
      1. 您需要创建自己的自定义 Firebase 令牌,以在 JWT 中包含自定义字段,例如 isAdmin: true。见https://firebase.google.com/docs/auth/admin/create-custom-tokens

      2. 见(1)

      【讨论】:

      • 是的,但是一旦我创建了令牌,我需要使用客户端 sdk 登录并获取生成的 id 令牌。如果我错了,请纠正我,但我认为我无法使用 node admin sdk 登录。
      • 第一部分更正,第二部分更正。 Admin SDK 不使用客户端 SDK 身份验证方法。您将使用此处指定的service accountfirebase.google.com/docs/admin/setup#initialize_the_sdk
      • 我知道如何使用服务帐户初始化 sdk。我只是不确定这如何解决我的问题:/。
      猜你喜欢
      • 2018-12-05
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2021-11-09
      • 2021-09-19
      • 2015-03-23
      • 2017-10-19
      相关资源
      最近更新 更多