如何删除Firebase Auth中2023年1月1日以来未登录的用户?
解决Firebase Auth批量删除长期未登录用户问题
问题分析
你的代码中直接调用userRecord.metadata.lastSignInTime.getTime()可能报错,原因是lastSignInTime返回的是ISO 8601格式的字符串(而非Date对象),另外还要考虑从未登录过的用户(这类用户的lastSignInTime为null,需直接纳入删除范围)。同时,针对5万用户的规模,单个调用getUser效率极低,必须用批量遍历的方式处理。
解决方案
以下是完整的Cloud Functions实现,包含批量用户遍历、时间校验和删除逻辑:
exports.deleteInactiveUsers = functions.https.onCall(async (data, context) => { // 验证调用者权限(可选,建议添加,避免恶意调用) if (!context.auth || !context.auth.token.admin) { throw new functions.https.HttpsError('permission-denied', '仅管理员可执行此操作'); } const cutoffTimestamp = new Date('2023-01-01').getTime(); let deletedCount = 0; let pageToken; do { try { // 批量获取用户,每次最多1000条 const listUsersResult = await admin.auth().listUsers(1000, pageToken); // 遍历当前页用户 for (const userRecord of listUsersResult.users) { let lastSignInTimestamp; // 处理从未登录的用户 if (!userRecord.metadata.lastSignInTime) { lastSignInTimestamp = 0; } else { // 将ISO字符串转为Date对象,再获取时间戳 lastSignInTimestamp = new Date(userRecord.metadata.lastSignInTime).getTime(); } // 对比时间戳,符合条件则删除 if (lastSignInTimestamp < cutoffTimestamp) { await admin.auth().deleteUser(userRecord.uid); deletedCount++; console.log(`已删除用户: ${userRecord.uid}`); } } pageToken = listUsersResult.pageToken; } catch (error) { console.error('处理用户时出错:', error); throw new functions.https.HttpsError('internal', '批量删除用户失败', error.message); } } while (pageToken); // 循环处理所有分页 return { message: `成功删除 ${deletedCount} 个长期未登录用户` }; });
关键说明
- 权限校验:添加了管理员权限验证,确保只有授权用户能触发删除操作,可根据你的实际权限逻辑调整。
- 批量遍历:使用
listUsers分页获取用户,适配5万用户的规模,避免单次请求超时。 - 时间处理:兼容从未登录的用户(
lastSignInTime为null),统一转为时间戳0,确保这类用户被纳入删除范围。 - 错误处理:捕获遍历和删除过程中的错误,避免单个用户的删除失败导致整个流程中断。
内容的提问来源于stack exchange,提问作者Greg Fielding
相关产品推荐
相关产品推荐

