如何列出使用firebase admin SDK的所有用户

3mpgtkmj  于 2023-01-09  发布在  其他
关注(0)|答案(9)|浏览(149)

有没有办法列出所有使用firebase admin sdk的用户?文档只显示了通过uid或email获取一个用户。

bgibtngc

bgibtngc1#

最新的firebase-admin sdk(从现在的5.4.2版本开始)有listUsers API可以做到这一点。
有一件事要添加到示例中,nextPageToken必须被省略或者是有效的userid。(IMO,这在示例和API文档中都不明显。)

eblbsuwk

eblbsuwk2#

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

原答复:
没有用于从Firebase Admin SDK检索用户列表的公共API。
处理这种情况的典型方法是在Firebase数据库中保留一个相关用户信息的列表。更多信息请参见原始问题:How do I return a list of users if I use the Firebase simple username & password authentication

lyfkaqu1

lyfkaqu13#

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

plicqrtu

plicqrtu4#

这不是一个好的解决方案,但您可以使用Firebase CLI导出用户数据并与您的应用程序集成。
授权:导出
firebase身份验证:导出帐户文件--格式=文件格式
https://firebase.google.com/docs/cli/auth

sqserrrh

sqserrrh5#

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);
        });
}

关于服务帐户. 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控制台=〉项目设置=〉服务帐户=〉生成新私钥

brc7rcf0

brc7rcf06#

我得到了这个异步版本的工作:
(我还没有考虑代码的流程,所以这里使用异步可能在性能方面效率低下......老实说,我只使用异步是因为我不喜欢查看深度嵌套的承诺代码)

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);
})();
5jvtdoz2

5jvtdoz27#

正如官方文档Firebase Documentation中所述,获取用户列表的方法已经提到,但它一次最多只能列出1000个用户。但如果用户超过1000,我们需要使用自己的逻辑来获取那些剩余的用户。
在这里,我尝试使用递归的方法来获取firebase数据库中的完整用户列表。

async getAllUsers(nextPageToken?: String): Promise<any[]> {

    // List batch of users can be max 1000 at a time.
    var _users_list = [];
    await this.firebaseAdmin.auth()
        .listUsers(100, nextPageToken)
        .then(async (listUsersResult) =>

            _users_list = listUsersResult.users;

            console.log("list user page token =>", listUsersResult.pageToken);
            
            if (listUsersResult.pageToken) {
                // List next batch of users.
                const temp_list =  await this.getAllUsers(listUsersResult.pageToken);
                if (temp_list.length > 0) { _users_list = _users_list.concat(temp_list); }
            }

        })
        .catch((error) => {
            console.log('Error listing users:', error);
        });

    return _users_list
};

此函数返回在firebase auth中注册的所有用户的列表。

  • 这里我使用了长度为100的批处理,只是为了检查该函数是否正常工作,您可以将其更改为最大1000,一千后它抛出异常,如firebase文档中所述 *
p1iqtdky

p1iqtdky8#

public async getAllUsers(): Promise<UserRecord[]> {
    const records: UserRecord[] = [];

    const listAllUsers = async (maxResults = 1000, nextPageToken?: string): Promise<void> => {
        const listAllUsersResult = await firebase.auth().listUsers(maxResults, nextPageToken);

        listAllUsersResult.users.forEach(userRecord => {
            records.push(userRecord);
        });

        if (listAllUsersResult.pageToken) {
            await listAllUsers(maxResults, listAllUsersResult.pageToken);
        }
    };

    await listAllUsers();

    return records;
}
zysjyyx4

zysjyyx49#

您还可以使用递归返回所有用户记录(UserRecord[])。

import * as FAdmin  from 'firebase-admin/lib/auth'

export const findUnusedUsers = functions.https.onCall((data, context) => {
  return listAllUsers().then(allUsers => {
     return allUsers
  })
})

const listAllUsers = (nextPageToken?: string, accumulatorUsers: FAdmin.auth.UserRecord[] = []): Promise<FAdmin.auth.UserRecord[]> => {
  return admin.auth().listUsers(1000, nextPageToken)
    .then(function(listUsersResult) {
      const users = [...accumulatorUsers, ...listUsersResult.users]
      if (listUsersResult.pageToken) {
        return listAllUsers(listUsersResult.pageToken, users)
      } else {
        return users
      }
    })
}

相关问题