Firebase 自定义声明不会传播

Eze*_*eja 2 javascript firebase firebase-authentication angularfire2

我正在使用 angularfire2 使用 Angular6 应用程序。我在用户创建中将角色设置为自定义声明,但它似乎没有传播。

创建用户时,我将用户 ID、业务 ID 和角色发送到云功能:

出价 > 商业 ID

角色 > 角色

req.body.uid > 用户 ID

  const customClaims = {
    roles: { [bid]: urole }
  }
  admin.auth().setCustomUserClaims(req.body.uid, customClaims)
    .then(result => {
      res
        .status(200)
        .send()
    })
Run Code Online (Sandbox Code Playgroud)

问题是当对云函数的调用完成时,我想将用户重定向到需要用户设置自定义声明的路由,但它失败了。经过一些调试,我发现如果运行:

this.angularFireAuth.auth.currentUser.getIdTokenResult(true).then(result => {
      return result.claims.roles
    })
Run Code Online (Sandbox Code Playgroud)

在调用云函数“result.claims.roles”之后立即未定义,但是如果我刷新页面,“result.claims.roles”就会有我之前设置的数据。

我已经尝试过 reload 方法和 getIdToken(true) 但我遇到了同样的问题。

有没有办法避免刷新页面并获得自定义声明?

谢谢!

Fra*_*len 6

当用户登录时,他们会获得一个有效期约为一个小时的 ID 令牌。如果您设置自定义声明,他们的个人资料会立即更新,但他们的 ID 令牌不会自动更新。因此,您需要刷新他们的 ID 令牌以获取新的自定义声明。

据我所知,这个 ID 令牌只有getIdTokenResult在它过期时才会通过调用来刷新。如果是这样的原因,调用user.reload()获取ID令牌应该给你更新的要求。

  • 我已经做了这个修改,但我仍然没有得到之前设置的角色:`return this.angularFireAuth.auth.currentUser.reload().then(() => { return this.angularFireAuth.auth.currentUser.getIdTokenResult( true) });` 但是,如果我手动刷新页面,我会得到它们。PS:我添加了 **getIdTokenResult(true)** 来强制刷新令牌。 (6认同)
  • 从管理 SDK 设置自定义声明后,您需要强制刷新(传递 true)以确保最新声明是最新的。 (4认同)
  • 这很奇怪。`getIdTokenResult(true)` 应该强制刷新并更新最新的声明。除非用户最初使用自定义令牌登录。在这种情况下,自定义令牌声明将始终覆盖通过管理 sdk 设置的外部令牌。 (3认同)