Firebase 身份验证:编辑 UID

Dan*_* P. 12 javascript firebase

是否可以以编程方式在 Firebase 中更改用户的 UID?似乎无法在 Firebase 的控制台中手动执行此操作。

Roc*_*coB 7

TL;DR:如果您需要指定 UID,则需要使用该 UID 创建一个新用户。

您不能直接更改 UID,但我可以使用 firebase 管理 API ( docs )一起破解某些内容

我的用例是我需要更改用户的电子邮件地址。我尝试使用"Update a User"更新电子邮件,但这实际上最终改变了引擎盖下的 UID。在我的应用程序中,UID 与很多东西相关联,我必须对架构进行巨大的更改,所以这不是一个选项。

我使用 API 执行此操作的一般方法是:

  • 下拉用户使用 admin.auth().getUserByEmail
  • 删除用户 admin.auth().deleteUser
  • admin.auth().createUser使用getUserByEmail上面调用中的相关数据创建一个新用户,用新电子邮件替换电子邮件地址。
  • firebase 管理控制台中的“重置密码”(我认为也可以通过编程方式执行此操作)
  • 用户收到一封用于重置密码的电子邮件,并且他们拥有一个使用旧 UID 的新帐户。

与 不同admin.auth().updateUsercreateUser实际上允许您指定 UID。


Ven*_*ryx 5

基于RoccoB 的回答,以下是更改用户 UID 的完整说明:

  1. 创建一个新文件夹,并npm init使用默认值运行。
  2. 运行npm install firebase-admin
  3. UpdateUserUID.js使用以下代码创建一个 NodeJS 脚本文件(例如):
let admin = require("firebase-admin");

// config
let email = "XXX";
let serviceAccountData = require("XXX.json");
let adminConfig = {
    credential: admin.credential.cert(serviceAccountData),
    databaseURL: "https://XXX.firebaseio.com",
};
let newUserOverrides = {
    uid: "XXX",
};

Start();
async function Start() {
    console.log("Initializing firebase. databaseURL:", adminConfig.databaseURL);
    admin.initializeApp(adminConfig);

    console.log("Starting update for user with email:", email);
    let oldUser = await admin.auth().getUserByEmail(email);
    console.log("Old user found:", oldUser);

    await admin.auth().deleteUser(oldUser.uid);
    console.log("Old user deleted.");

    let dataToTransfer_keys = ["disabled", "displayName", "email", "emailVerified", "phoneNumber", "photoURL", "uid"];
    let newUserData = {};
    for (let key of dataToTransfer_keys) {
        newUserData[key] = oldUser[key];
    }
    Object.assign(newUserData, newUserOverrides);
    console.log("New user data ready: ", newUserData);

    let newUser = await admin.auth().createUser(newUserData);
    console.log("New user created: ", newUser);
}
Run Code Online (Sandbox Code Playgroud)
  1. 用正确的值替换emailadminConfig.databaseURL
  2. 替换newUserOverrides.uid为所需的新 uid。(您也可以更改其他一些字段)
  3. 为您项目的 Firebase Admin 服务帐户生成/下载私钥:https ://firebase.google.com/docs/admin/setup (可以跳到“初始化 SDK”部分)
  4. 更新serviceAccountData变量的导入以指向上一步中的关键 json 文件。
  5. 运行node ./UpdateUserUID.js
  6. 如果适用(我似乎不需要它),请使用 Firebase 管理控制台中的“重置密码”选项,将密码重置电子邮件发送给用户,显然已完成帐户更新。(也许我不需要这一步,因为除了在我的网站上登录之外,我不使用帐户/身份验证...)