18

有没有办法列出所有使用 firebase admin sdk 的用户?文档仅显示通过 uid 或电子邮件获取一个用户。

4

6 回答 6

18

最新的firebase-admin sdk(截至目前的版本5.4.2)具有listUsers可以做到这一点的 API。例子在这里

要添加到示例中的一件事是,nextPageToken必须省略或有效的用户 ID。(IMO,在示例或 API 文档中都不明显。)

于 2017-10-23T03:44:11.027 回答
13

更新正如@Webp 在他们的回答中所说,现在有一个API 可以列出Admin SDK 中的所有用户。

原答案:

没有用于从 Firebase Admin SDK 检索用户列表的公共 API。

处理这种情况的典型方法是在 Firebase 数据库中保留相关用户信息的列表。有关更多信息,请参阅此原始问题:如果我使用 Firebase 简单用户名和密码身份验证,如何返回用户列表

于 2016-12-07T08:32:20.507 回答
6

您可以使用auth().listUsers()admin sdk 中提供的方法。详细的示例代码可以在这里找到。 Firebase 管理员 SDK 文档

于 2018-03-06T04:13:33.763 回答
4

这不是一个好的解决方案,但您可以使用 Firebase CLI 导出用户数据并与您的应用程序集成。

授权:出口

firebase auth:export account_file --format=file_format

https://firebase.google.com/docs/cli/auth

于 2017-07-14T13:56:34.537 回答
3

2020 年 3 月,经过大量的文档和各种帖子的斗争,我发现了以下作品:

const admin = require("firebase-admin");
const serviceAccount = require('./serviceAccount.json'); // see notes below about this.

const listAllUsers = () => {

    const app = admin.initializeApp({
        databaseURL: 'https://your-project-name.firebaseio.com',
        credential: admin.credential.cert(serviceAccount) <-- see notes below about this
    });

    app.auth().listUsers(1000) // lists up to 1000 users
        .then((listUsersResult) => {

            let users = JSON.stringify(listUsersResult);

            const date = new Date();
            const day = date.getDate();
            const month = date.getMonth() + 1;

            fs.writeFileSync(__dirname + `/../my-backups/authentication-backup_${day}_${month}_2020.json`, users);
        })
        .catch(function (error) {
            console.log('Oh no! Firebase listUsers Error:', error);
        });
}

重新 serviceAccount.json

这与您在使用 react-firebase 或前端的 npm firebase 模块之类的东西时传入的通常的 Firebase 配置不同。

要在服务器端获得 CRUD 权限,您似乎需要以下内容:

{
  "type": "service_account",
  "project_id": "my-project-id",
  "private_key_id": "xxxxxxxxxxxxxxxxxxx",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMxxxxxxxxxxxxxxzuUA=\n-----END PRIVATE KEY-----\n",
  "client_email": "firebase-adminsdk-em4gz@my-project-name-email-thing.iam.gserviceaccount.com",
  "client_id": "0000000000000000000",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-em4gz%40my-proj-name.iam.gserviceaccount.com"
}

如果你还没有生成一个,我通过以下方式得到了我的:

Firebase 控制台 => 项目设置 => 服务帐户 => 生成新私钥

于 2020-03-02T10:48:39.863 回答
0

我得到了这个异步版本:

(我没有考虑过代码的流程,所以这里使用 async 可能在性能方面效率低下……老实说,我只使用 async 是因为我不喜欢看深度嵌套的 promise 代码)

const firebase = require('firebase-admin');
const credential = require('./credential.json');

firebase.initializeApp({
  credential: firebase.credential.cert(credential)
});

let users = [];

async function getAllUsers(pageToken) {
  const results = await firebase.auth().listUsers(1000, pageToken);
  for (let i = 0; i < results.users.length; i++) {
    const user = results.users[i];
    const {uid, email} = user;
    users.push({uid, email});
  }
  if (results.pageToken) {
    getAllUsers(results.pageToken);
  }
};

(async () => {
  await getAllUsers();
  console.log(users);
})();
于 2021-11-20T15:25:57.357 回答