Firebase Auth用户迁移:如何导出含Sign In with Apple用户providerUserInfo的完整用户数据
providerUserInfo) 我之前刚好碰到过完全一样的问题——firebase auth:export确实会漏掉Sign In with Apple(SIWA)用户的完整providerUserInfo数据,但你提到的accounts:lookup REST端点完全可行,另外用Firebase Admin SDK写个脚本也是更省心的方案。下面一步步给你讲清楚:
1. 使用accounts:lookup REST API获取完整SIWA用户数据
这个端点能直接从Firebase Auth获取用户的完整提供商信息,包括你需要的Apple用户ID。这里纠正一个误区:你需要的不是用户的idToken,而是服务账户的访问令牌来认证请求。
步骤1:获取服务账户访问令牌
打开终端,用gcloud命令行(确保已登录并关联你的Firebase项目)生成令牌:
gcloud auth application-default print-access-token
复制输出的字符串,这就是后续请求要用的认证令牌。
步骤2:构造批量查询请求
端点URL格式:
https://identitytoolkit.googleapis.com/v1/accounts:lookup?key=[你的Firebase项目Web API密钥]
(Web API密钥可以在Firebase控制台→项目设置→通用里找到)
发送POST请求,请求头添加:
Authorization: Bearer [刚才拿到的访问令牌] Content-Type: application/json
请求体是包含要查询用户UID的JSON数组:
{ "localId": ["user-uid-1", "user-uid-2", "user-uid-3"] }
每次最多可以查询100个用户ID。
步骤3:提取所需数据
响应里每个用户的providerUserInfo数组会包含apple.com条目,其中rawId就是你迁移需要的Apple用户ID。你可以先通过firebase auth:export导出所有用户的UID,然后分批查询,再把provider数据合并到原始导出文件中。
2. 更省心的方案:用Firebase Admin SDK脚本批量导出
如果不想折腾REST API,写个Node.js脚本用Admin SDK直接拉取完整用户数据更高效:
const admin = require('firebase-admin'); const fs = require('fs'); // 初始化Admin SDK(确保已设置GOOGLE_APPLICATION_CREDENTIALS环境变量) admin.initializeApp({ credential: admin.credential.applicationDefault() }); async function exportUsersWithSIWAData() { const allUsers = []; let pageToken; // 分页获取所有用户(每次最多1000个) do { const listUsersResult = await admin.auth().listUsers(1000, pageToken); allUsers.push(...listUsersResult.users); pageToken = listUsersResult.pageToken; } while (pageToken); // 处理用户数据,确保providerUserInfo包含完整SIWA信息 const exportData = allUsers.map(user => { return { ...user.toJSON(), providerUserInfo: user.providerData.map(provider => ({ providerId: provider.providerId, federatedId: provider.uid, rawId: provider.uid, email: provider.email, displayName: provider.displayName })) }; }); // 写入JSON文件 fs.writeFileSync('users-with-siwa-data.json', JSON.stringify(exportData, null, 2)); console.log('导出完成!所有SIWA用户的provider数据已补全'); } exportUsersWithSIWAData().catch(err => console.error('导出失败:', err));
运行脚本前,记得把服务账户密钥文件路径设置到GOOGLE_APPLICATION_CREDENTIALS环境变量,或者直接在initializeApp里指定密钥路径。
为什么firebase auth:export会丢失SIWA数据?
这是Firebase CLI工具的一个已知限制——它导出的providerUserInfo对于部分第三方身份提供商(包括Apple)会做截断,而Admin SDK和accounts:lookup端点直接调用Firebase Auth的底层API,所以能获取到完整的提供商数据。
内容的提问来源于stack exchange,提问作者Kevin Renskers

