如果users/{userId}
上有文档更新,我将尝试启动我的云功能
我有一个每次用户登录时都会触发的登录方法
signin: (email, password, setErrors) => {
firebase
.auth()
.signInWithEmailAndPassword(email, password)
.then(() => {
const isVerified = firebase.auth().currentUser.emailVerified
const userUid = firebase.auth().currentUser.uid
const db = firebase.firestore()
if (isVerified) {
db.collection('/users')
.doc(userUid)
.update({ isVerified: true })
}
})
.catch(err => {
setErrors(prev => [...prev, err.message])
})
},
除了基本的登录内容外,它还检查用户是否验证了他们的电子邮件,如果验证了,它将更新该用户的收藏。这里一切都按计划进行。
然而,我似乎无法启动我的云功能。
基本上,它在侦听user
集合上的更改。如果users/{userId}
文档具有isVerified
,并且用户电子邮件地址以xxxx
结尾,则应授予他们管理权限。
exports.updateUser = functions.firestore.document('users/{userId}').onUpdate((change, context) => {
const after = change.after.data()
if (after.isVerified) {
firebase.auth().onAuthStateChanged(user => {
if (user.emailVerified && user.email.endsWith('@xxxx')) {
const customClaims = {
admin: true,
}
return admin
.auth()
.setCustomUserClaims(user.uid, customClaims)
.then(() => {
console.log('Cloud function fired')
const metadataRef = admin.database().ref('metadata/' + user.uid)
return metadataRef.set({ refreshTime: new Date().getTime() })
})
.catch(error => {
console.log(error)
})
}
})
}
})
现在功能没有启动,有什么想法吗?
云函数中的代码作为管理帐户运行,无法使用常规的Firebase Authentication SDK进行检索。事实上,您应该只在Cloud Functions代码中使用Firebase Admin SDK,其中不存在onAuthStateChanged
方法。
目前还不完全清楚您希望此代码对用户执行什么操作,但如果您想检查路径中uid
所在的用户是否有经过验证的电子邮件地址,则可以使用Admin SDK通过其UID加载该用户。
为了确保路径中的uid
是执行操作的用户的真实UID,可以使用安全规则,如有关保护用户数据的文档中所示。
您可以通过以下方式获取管理员用户:
if (after.isVerified) {
admin.auth().getUser(userId)
.then((userData) => { ...