文档更新时的云函数触发器



如果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) => { ... 

相关内容

  • 没有找到相关文章

最新更新