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

Firebase Auth用户迁移:如何导出含Sign In with Apple用户providerUserInfo的完整用户数据

How to Export Sign In with Apple User IDs from Firebase Auth (Fix Empty 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 13:37:37