首页 > 解决方案 > Firebase onCreate 向 auth.user 添加自定义声明

问题描述

我正在尝试添加自定义声明,isRegistered 到 firebase。我的 Firestore 有另一个user集合来保存注册信息记录。现在我试图保留一个 isRegistered 自定义声明,但我似乎无法让它工作。

exports.addRegisteredRole = functions.database.ref('/user')
    .onCreate((snap, context) => {
      return // **I added this later, but the issue still remains.**
        admin.auth()
            .setCustomUserClaims(context.auth.uid, {isRegistered: true})
            .then(() => {
                console.log('done', snap)
                return {
                    message: 'done',
                    data: snap
                }
            })
            .catch(err => {
                console.log('something went wrong', err);
                return err
            })
    });

我正在通过以下方式检查此声明,

currentUser.getIdTokenResult()
        .then(res => {
            console.log(res.claims.isRegistered)
        })

(认证用户对象)。即使我重新登录它仍然未定义。我做错了什么吗,我对firebase很陌生。

标签: reactjsfirebase-realtime-databasefirebase-authenticationgoogle-cloud-functionsfirebase-admin

解决方案


问题在于您的 onCreate 触发器。您假设您在 context.auth 对象中获取 uid,这是不正确的。

onCreate 触发器将在您的“用户”集合中添加新文档时自动触发。在这种情况下, context.aut.uid 是未定义的。您应该在函数日志中跟踪这一点。

您可以通过几种方式实现您想要做的事情

  1. 如果用户记录文档以用户ID作为文档名称,您可以执行以下操作
exports.addRegisteredRole =
  functions.firestore
    .document('test/{docId}')
    .onCreate((snap, context) => {
      admin.auth()
        .setCustomUserClaims(snap.id, { isRegistered: true })
        .then(() => {
          console.log('done', snap)
          return {
            message: 'done',
            data: snap
          }
        })
        .catch(err => {
          console.log('something went wrong', err)
          return err
        })
    })
  1. 如果您使用其他名称命名用户记录文档,或者让 firebase 为您决定名称,那么您必须将 uid 作为文档数据中的属性。然后你使用 docSnapshot.data().uid 而不是 docSnapshot.id 如下
exports.addRegisteredRole =
  functions.firestore
    .document('test/{docId}')
    .onCreate((snap, context) => {
      admin.auth()
        .setCustomUserClaims(snap.data().uid, { isRegistered: true })
        .then(() => {
          console.log('done', snap)
          return {
            message: 'done',
            data: snap
          }
        })
        .catch(err => {
          console.log('something went wrong', err)
          return err
        })
    })

祝你好运


推荐阅读