【问题标题】:Firebase custom claims doesn't seem to workFirebase 自定义声明似乎不起作用
【发布时间】:2021-10-29 15:00:30
【问题描述】:

我的项目有问题 - 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)
})

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

现在解决问题。我定义了一个函数来在客户端获取用户声明,如文档中所述:

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

(firebaseInstance 已导入并在整个项目中正常工作)

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

如果我尝试访问 idTokenResult.claims.admin 就像在文档中一样,它会记录我 UNDEFINED。

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

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

【问题讨论】:

    标签: node.js firebase firebase-authentication google-cloud-functions google-admin-sdk


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢!它奏效了,我留下了关于部分解释的反馈。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2021-07-24
    相关资源
    最近更新 更多