有没有办法在更新用户节点时触发 Firebase 函数?



我有两个节点,其中包含用户的关联电子邮件。 每当用户重置其身份验证电子邮件时,它都会在 Firebase 身份验证用户节点中更新,并通过扇出技术在我的数据库中更新另外两个节点。 每次用户更新其身份验证电子邮件时,都会向他们发送电子邮件地址更改通知,允许他们还原电子邮件地址更改。

我遇到的问题是,如果用户还原这些更改,正确的电子邮件地址将不再反映在数据库中,并且处于不一致的状态。 我的解决方案是,每当用户更改其身份验证电子邮件时,都会通过云函数自动更新这些节点。

这可能吗?如果是这样,我将使用什么来实现它? 如果没有,是否有人知道的另一种解决方法可以使我的数据库在身份验证电子邮件更改时保持一致的状态?

经过几个小时的侦查,我发现这可以通过Firebase Admin SDK实现。 有关更多详细信息,请参阅 https://firebase.google.com/docs/auth/admin/manage-users。

基本上,您创建一个云函数,该函数使用管理员SDK重置电子邮件,而无需向用户发送讨厌的通知,并且在成功时,使用服务器扇出来更新数据库。

例如:

const functions = require('firebase-functions');
const admin = require("firebase-admin");
// Initializes app when using Firebase Cloud Functions 
admin.initializeApp(functions.config().firebase);
const databaseRef = admin.database().ref();

exports.updateEmail = functions.https.onRequest((request, response) 
// Cross-origin headers
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");
response.setHeader("Access-Control-Allow-Origin", "YOUR-SITE-URL");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
const email = request.body.email;
const uid = request.body.uid;
// Update auth user
admin.auth().updateUser(uid, {
"email": email
})
.then(function() {
// Update database nodes on success
let fanoutObj = {};
fanoutObj["/node1/" + uid + "/email/"] = email;
fanoutObj["/node2/" + uid + "/email/"] = email;
// Update the nodes in the database
databaseRef.update(fanoutObj).then(function() {
// Success
response.send("Successfully updated email.");
}).catch(function(error) {
// Error
console.log(error.message);
// TODO: Roll back user email update
response.send("Error updating email: " + error.message);
});
})
.catch(function(error) {
console.log(error.message);
response.send("Error updating email: " + error.message);
});
});

这种技术可用于在之后必须执行某些任务的情况下更改用户信息,因为Firebase还没有在用户的个人资料数据更改时运行的Cloud Function触发器,正如Doug Stevenson在评论中指出的那样。

最新更新