You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中获取Firebase Auth所有用户最后登录时间(仅管理员可见)

获取所有Firebase Auth用户的最后登录时间(仅管理员可见)

核心方案

Firebase客户端SDK无法直接获取全量用户列表,必须通过Admin SDK实现,同时要严格控制权限仅管理员可访问,具体步骤如下:

1. 初始化Firebase Admin SDK

在后端服务(如Cloud Functions、Node.js服务器)中初始化Admin SDK,它拥有读取所有Auth用户元数据的权限。

示例Node.js代码:

const admin = require('firebase-admin');

admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

2. 编写后端接口获取全量用户数据

通过Admin SDK的listUsers方法批量拉取用户,提取lastSignInTime,还可关联Firestore中的用户自定义数据。

示例Cloud Functions接口:

exports.getAllUsersLastSignIn = functions.https.onCall(async (data, context) => {
  // 验证调用者是否为管理员
  if (!context.auth || !context.auth.token.admin) {
    throw new functions.https.HttpsError('permission-denied', '仅管理员可访问此数据');
  }

  const usersList = [];
  let pageToken;

  // 分页获取所有用户(单次最多1000条)
  do {
    const result = await admin.auth().listUsers(1000, pageToken);
    result.users.forEach(user => {
      usersList.push({
        uid: user.uid,
        email: user.email,
        lastSignInTime: user.metadata.lastSignInTime,
        creationTime: user.metadata.creationTime
      });
    });
    pageToken = result.pageToken;
  } while (pageToken);

  // 可选:关联Firestore中的用户额外数据
  const firestorePromises = usersList.map(async user => {
    const userDoc = await admin.firestore().collection('users').doc(user.uid).get();
    return userDoc.exists ? { ...user, ...userDoc.data() } : user;
  });

  return Promise.all(firestorePromises);
});

3. 前端调用接口(仅管理员)

前端通过Callable Functions调用后端接口,确保当前用户已被标记为管理员。

示例前端代码:

const getAllUsersLastSignIn = firebase.functions().httpsCallable('getAllUsersLastSignIn');

getAllUsersLastSignIn()
  .then(result => {
    const users = result.data;
    // 渲染用户列表及最后登录时间(可将ISO字符串转为本地时间:new Date(user.lastSignInTime))
    console.log(users);
  })
  .catch(error => {
    console.error('获取用户数据失败:', error);
  });

4. 标记管理员用户

通过Admin SDK给指定用户添加admin自定义声明,用于权限验证:

// 给目标用户设置管理员权限
admin.auth().setCustomUserClaims('目标用户UID', { admin: true });

注意事项

  • 分页处理:listUsers单次最多返回1000条数据,需循环处理直到pageToken为空。
  • 权限严格:后端接口必须验证调用者的admin声明,避免数据泄露。
  • 时间转换:lastSignInTime为ISO格式字符串,前端可通过new Date()转换为本地时间展示。

内容的提问来源于stack exchange,提问作者Ageu Chamene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:20:25