3

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

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

出价>业务ID

角色 > 角色

req.body.uid > 用户标识

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

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

this.angularFireAuth.auth.currentUser.getIdTokenResult(true).then(result => {
      return result.claims.roles
    })

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

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

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

谢谢!

4

2 回答 2

6

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

据我所知,此 ID 令牌仅getIdTokenResult在过期时通过调用来刷新。如果这是原因,调用user.reload()然后获取 ID 令牌应该会为您提供更新的声明

于 2018-10-10T03:32:49.207 回答
1

对我来说,它只是从其中一条评论中获取建议:

// --------
// Frontend
// --------

// Triggering the cloud function
const url: string = 'url-to-your-cloud-function'
await this.http.post<unknown>(url, {}).toPromise();


// After cloud function was run and custom claim was set -> refresh the id token
// The 'currentUser' is a reference to the firebase user
await this.authService.currentUser.getIdToken(true);

// --------
// Cloud Function - createSubscription
// --------

const createSubscription = () => {  
  await admin.auth().setCustomUserClaims(userId, {
    subscriber: true
  })
}

于 2020-10-24T06:23:37.923 回答