Firebase自定义声明不会传播

时间:2018-10-09 20:51:34

标签: javascript firebase firebase-authentication angularfire2

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

在创建用户时,我会将userid,businessid和角色发送到云函数:

bid> businessid

urole>角色

req.body.uid>用户ID

  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),但是遇到了同样的问题。

有没有一种方法可以避免刷新页面并获得自定义声明?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

据我所知,如果ID令牌已过期,则只能通过调用getIdTokenResult来刷新它。如果这是原因,请致电user.reload(),然后然后获取ID令牌,即可获取更新的声明。

答案 1 :(得分: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
  })
}