Firebase 自定义声明似乎不起作用

Niv*_*Niv 0 node.js firebase google-admin-sdk firebase-authentication google-cloud-functions

我的项目 - Node.js 和 Firebase 存在问题。

我想添加管理员角色,因此我根据文档使用自定义声明。我在云函数中有3个函数:

exports.addAdminRole = functions.https.onCall((data, context) => {
  return admin.auth().setCustomUserClaims(context.auth.uid, {
    admin: true
  }).then(() =>'Success!')
    .catch(err => err)
})


exports.getUserRecord = functions.https.onCall((data, context) => {
  return admin.auth().getUser(context.auth.uid)
    .then(userRecord => userRecord.customClaims)
    .catch(err => err)
})


exports.deleteAdmin = functions.https.onCall((data, context) => {
  return admin.auth().setCustomUserClaims(context.auth.uid, null)
    .then(() => 'Deleted admin!')
    .catch(err => err)
})
Run Code Online (Sandbox Code Playgroud)

我直接在客户端中调用函数(可调用 http)并且 addAdminRole 返回“成功!” 似乎有效。getUserRecord 似乎也能正常工作,并返回 {admin: true} 作为我的自定义声明。

现在来说说问题。我定义了一个函数来获取客户端的用户声明,如文档中提到的:

getRecords() {
      firebaseInstance.auth.currentUser.getIdTokenResult()
      .then(idTokenResult => {console.log("ADMIN:", idTokenResult)})
      .catch(err => console.error(err))
    }
Run Code Online (Sandbox Code Playgroud)

(firebaseInstance已导入并且在整个项目中运行良好)

我不明白为什么,但客户端中的代码返回一个具有 Claims 属性的对象,但该属性没有我在云函数中添加的管理声明。

如果我尝试idTokenResult.claims.admin像文档中那样访问,它会记录我未定义。

链接到文档 - https://firebase.google.com/docs/auth/admin/custom-claims#node.js

你能向我解释一下出了什么问题吗?感谢您的帮助!

Fra*_*len 7

用户的声明存储在他们的 ID 令牌中,该 ID 令牌由 SDK 每小时自动刷新。

从 Admin SDK 为用户的个人资料设置自定义声明不会强制自动刷新客户端的 ID 令牌,因此可能需要长达一个小时才能在客户端中显示该声明。文档暗示了这一点:

一旦最新的声明已传播到用户的 ID 令牌,您就可以通过检索 ID 令牌来获取它们:...

不过,该文档可能更明确,因此我建议使用该页面底部的按钮留下反馈。

为了确保声明更快地传播到客户端,您应该强制客户端刷新其 ID 令牌(例如,通过传递truegetIdTokenResult().