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

use*_*654 6 node.js firebase firebase-authentication firebase-realtime-database google-cloud-functions

我有两个包含用户关联电子邮件的节点。每当用户重置其身份验证电子邮件时,它都会在 Firebase 身份验证用户节点中进行更新,并通过扇出技术在我的数据库中的两个附加节点中进行更新。每次用户更新其身份验证电子邮件时,他们都会收到电子邮件地址更改通知,这允许他们恢复电子邮件地址更改。

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

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

use*_*654 5

经过几个小时的调查,我发现可以通过 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);
    });
});
Run Code Online (Sandbox Code Playgroud)

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