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
相关产品推荐
相关产品推荐

