firebase 在Firestore云函数中检查用户是否为匿名用户

smdncfj3  于 2023-02-25  发布在  其他
关注(0)|答案(3)|浏览(151)

当用户通过身份验证时,我会触发下面的云Firestore云功能;

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase)

exports.createUserAccount = functions.auth.user().onCreate((user) => {
    const uid = user.uid
    const firstName = user.firstName
    const familyName = user.familyName
    const displayName = user.displayName
    const email = user.email
    const photoURL = user.photoURL

    const newUser = admin.firestore().doc(`/users/${uid}`)

    return newUser.set({
        firstName: firstName,
        familyName: familyName,
        displayName: displayName,
        email: email,
        photoURL: photoURL,
    })
})

当一个用户匿名登录时,我遇到了一个问题。我试着添加一个const isAnonymous = user.isAnonymous,然后在下面返回它;

return newUser.set({
    isAnonymous: isAnonymous,

错误登录控制台

Error: Value for argument "data" is not a valid Firestore document. Cannot use "undefined" as a Firestore value (found in field isAnonymous).

我的问题是如何检查用户是否通过Firebase云功能匿名登录?

hwazgwia

hwazgwia1#

传递给auth函数的UserRecord对象永远不会有isAnonymous属性。这就是为什么它总是取值undefined。检查API文档的链接,看看那里有什么。我不知道你是如何得出结论,它应该在那里。
每个验证过帐户的身份验证提供程序都存在于UserRecord对象的providerData数组属性中。您应该查看该数组以检查它是否是匿名帐户。具体来说,您应该检查providerData数组中每个UserInfo对象的providerId字段。我不能100%确定这是否是正确的方法,但根据我的观察,一个匿名帐户将有一个providerData数组,因为它没有经过任何身份验证提供程序的验证。

cu6pst1q

cu6pst1q2#

只要您使用的是基于电子邮件的身份验证(电子邮件+通行证& OAuth),那么您只需检查

if (user.email !== null){ 
  // Run this code if the user is not anonymous
}

文件

iezvtpos

iezvtpos3#

据我所知,没有直接的API来检查一个用户是否是匿名的使用firebase管理sdk。通过检查一个用户一直是活跃的,没有任何连接的登录提供者,我相信它应该工作,但是。

const user = await admin.auth().getUser('Bp7DmEl5HKcDKrQr7QFVnQXS8FH1')
const hasBeenActive = user.metadata.lastSignInTime != null
const hasProviders = user.providerData.length > 0
const isAnonymous = hasBeenActive && !hasProviders

请注意,激活检查的原因是为了过滤掉使用firebase控制台或admin sdk手动创建的用户。根据您的使用情况,您可能也希望将他们视为匿名用户。

相关问题