如何匯出 Firebase Authentication 使用者
Firebase Authentication 的使用者(Users)分頁會列出專案中的每個帳戶,卻無法把它們下載下來:它唯一的選單裡只有密碼雜湊參數。要把使用者匯出成檔案,有三種方法。哪一種合適,取決於檔案的用途:是用來查看、分享或寄送電子郵件的名單,還是要搬到另一個專案。
更新於 2026年10月7日。 方法 1 中的擴充功能 Firexport 是我們開發的。方法 2 和 3 不需要它。
簡短回答
| 1. 控制台 + 擴充功能 | 2. Firebase CLI | 3. Admin SDK 指令碼 | |
|---|---|---|---|
| 準備工作 | 安裝一個 Chrome 擴充功能 | Node.js 和 Firebase CLI | Node.js 和 Google Cloud 憑證 |
| 格式 | 含標題列的 CSV,或 JSON | 不含標題列的 CSV,或 JSON | 含標題列的 CSV(或你的程式碼寫出的格式) |
| 時間 | 控制台顯示的日期(Advanced 為 ISO 8601) | epoch 毫秒 | ISO 8601 |
| 自訂聲明 | Advanced 才有 | 包含 | 包含 |
| 密碼雜湊 | 從不讀取 | 包含(需 Editor 或 Owner 角色) | 不包含 |
1. 用 Firexport 從 Firebase 控制台匯出
在 Firebase 控制台中,Authentication > 使用者(Users)會把你的使用者顯示在表格中,一次一頁,但沒有任何下載它們的方法。Firexport 是一款免費的 Chrome 擴充功能,會在這個表格上加入一個「匯出」按鈕。
- 從 Chrome 線上應用程式商店安裝 Firexport。
- 在 Firebase 控制台開啟 Authentication,然後開啟使用者(Users)分頁。
- 按一下匯出,它就在新增使用者(Add user)的右側。 Firexport 會走過表格的每一頁,下載一個 CSV 檔案。要匯出 JSON,開啟按鈕旁的 ⋮ 選單並選擇匯出為 JSON。

檔案裡會有:
- 在免費版中,每位使用者一列,包含
uid、identifier、disabled、providers、creationTime和lastSignInTime:也就是控制台所顯示的表格。日期採用控制台的格式,不含時間,供應商則是 Email 或 Google 這類名稱。 - 付費方案 Firexport Advanced 會以 Admin SDK 的名稱寫出每位使用者的完整記錄:
email、emailVerified、displayName、phoneNumber、photoURL、providerData、customClaims、multiFactor,以及以 ISO 8601(UTC)表示的建立、登入和權杖時間。 - 無論控制台使用哪種語言,欄名都是英文,所以每次匯出的欄位都相同。
密碼雜湊從不會被讀取,你的使用者資料也只留在你的瀏覽器中:檔案在瀏覽器內產生,除了你的下載資料夾之外哪裡都不會去。不需要服務帳戶金鑰,也不需要設定 CLI,因為它在你已登入的控制台工作階段中執行。它可在 Chrome 及其他以 Chromium 為基礎的瀏覽器中執行。
一次查看一位使用者
要查看單一使用者,把滑鼠游標移到該使用者的那一列上。該列動作最前面的資訊圖示會開啟一張卡片,顯示完整記錄:顯示名稱、電子郵件已驗證、供應商、登入和權杖時間、自訂聲明和第二重驗證。卡片上的複製圖示會以 JSON 格式把這位使用者複製到剪貼簿。兩者都是免費的。

不用 CLI、不用服務帳戶金鑰,直接從控制台匯出你的 Firebase 使用者。
2. 用 Firebase CLI 匯出
Firebase CLI 的 auth:export 指令會把專案中的每個帳戶下載到一個檔案。它是為了搭配 auth:import 把使用者搬到另一個專案而設計的,所以包含密碼雜湊和鹽值。這也讓這個檔案等同於憑證:別把它放在共用雲端硬碟,也別用電子郵件寄出。雜湊和鹽值欄位需要在專案上具有 Editor 或 Owner 角色的帳戶。
npm install -g firebase-tools
firebase login
firebase auth:export users.json --project your-project-id- 檔案名稱決定格式:
users.json或users.csv。 - CSV 沒有標題列。欄位依固定順序排列:UID、電子郵件、電子郵件是否已驗證、密碼雜湊、鹽值、名稱和相片網址, Google、Facebook、Twitter 和 GitHub 各四欄,接著是建立時間、上次登入時間、電話號碼和其他幾欄。Google 的 auth:export 參考資料列出了這些欄位。時間是 epoch 毫秒。
- JSON 保留 API 自己的名稱:
localId、createdAt、lastSignedInAt、providerUserInfo,以及存放自訂聲明的customAttributes(一個 JSON 字串)。 - 只有以 Firebase 的 scrypt 演算法雜湊的密碼才會被匯出。以其他演算法匯入、之後一直沒有登入過的使用者,匯出時雜湊和鹽值欄位會是空的。
要搬移使用者,請用舊專案的雜湊參數把檔案匯入另一個專案,這些參數位於 Authentication > 使用者(Users) > ⋮ > 密碼雜湊參數(Password hash parameters)。使用者會保留原本的 UID,也能用相同的密碼登入。
firebase auth:import users.json --project new-project-id \
--hash-algo=SCRYPT --hash-key=BASE64_SIGNER_KEY --salt-separator=BASE64_SALT_SEPARATOR \
--rounds=ROUNDS --mem-cost=MEM_COST3. 用 Admin SDK 指令碼匯出
如果要依自己的方式安排欄位,或者匯出需要排程執行,一段使用 Firebase Admin SDK 的簡短 Node.js 指令碼就能列出所有使用者,並寫出含標題列的 CSV。它需要一個能讀取使用者的帳戶:專案 Owner 或 Editor,或者 Firebase Authentication Viewer 角色。
- 安裝 SDK:
npm install firebase-admin - 登入以取得本機憑證:
gcloud auth application-default login。在伺服器上,改為讓GOOGLE_APPLICATION_CREDENTIALS指向服務帳戶金鑰。 - 把下面的指令碼存成
export-users.mjs,替換your-project-id,然後執行node export-users.mjs。
// Usage: node export-users.mjs → writes users.csv
import { writeFileSync } from 'node:fs';
import { initializeApp } from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';
initializeApp({ projectId: 'your-project-id' });
const auth = getAuth();
// listUsers returns at most 1,000 users per call, so follow the page token to the end.
const users = [];
let pageToken;
do {
const page = await auth.listUsers(1000, pageToken);
users.push(...page.users);
pageToken = page.pageToken;
} while (pageToken);
// One row per user. Times become ISO 8601. Password hashes are left out: this is a user list, not a backup.
const iso = (time) => (time ? new Date(time).toISOString() : '');
const rows = users.map((user) => ({
uid: user.uid,
email: user.email,
emailVerified: user.emailVerified,
displayName: user.displayName,
phoneNumber: user.phoneNumber,
disabled: user.disabled,
providers: user.providerData.map((provider) => provider.providerId).join(' '),
creationTime: iso(user.metadata.creationTime),
lastSignInTime: iso(user.metadata.lastSignInTime),
customClaims: user.customClaims ? JSON.stringify(user.customClaims) : '',
}));
// Quote any cell with a comma, a quote or a line break.
function cell(value) {
const text = value === undefined || value === null ? '' : String(value);
return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
}
const columns = ['uid', 'email', 'emailVerified', 'displayName', 'phoneNumber', 'disabled',
'providers', 'creationTime', 'lastSignInTime', 'customClaims'];
const lines = [columns, ...rows.map((row) => columns.map((column) => row[column]))];
// The byte order mark at the start makes Excel read names in any language correctly.
writeFileSync('users.csv', '' + lines.map((line) => line.map(cell).join(',')).join('\r\n'));
console.log(`Wrote ${rows.length} users to users.csv`);- 如果呼叫因為 API「需要配額專案(requires a quota project)」而失敗,執行
gcloud auth application-default set-quota-project your-project-id後再試一次。 listUsers依 UID 順序回傳使用者,而不是依註冊日期。如果需要那種順序,請自行排序資料列。- SDK 只會把密碼雜湊回傳給具有
firebaseauth.configs.getHashConfig權限的帳戶,而這個指令碼無論如何都不會輸出它們。要連同密碼一起搬移使用者,請使用方法 2。
常見問題
Firebase 控制台能匯出 Authentication 使用者嗎?
不能。使用者(Users)分頁只有搜尋框、新增使用者(Add user)、重新整理按鈕,以及一個唯一項目是密碼雜湊參數(Password hash parameters)的選單。要把使用者存成檔案,需要 Firebase CLI(firebase auth:export)、Admin SDK,或是在這個分頁加入「匯出」按鈕的瀏覽器擴充功能。
如何從 Firebase 取得所有使用者電子郵件的清單?
匯出使用者後保留電子郵件那一欄即可。在 Firexport 的免費匯出中,它是 identifier 欄,內容與控制台顯示的一致:電子郵件,或者以電話號碼登入的使用者的電話號碼。在 Admin SDK 指令碼中,從 listUsers 收集 user.email。
匯出的內容包含使用者的密碼嗎?
沒有任何方法能取得明文密碼,因為 Firebase 從不儲存明文密碼。firebase auth:export 包含密碼雜湊和鹽值,firebase auth:import 會用它們搬移使用者,讓密碼照常可用。Firexport 從不讀取雜湊,Admin SDK 則只在有額外權限時才會回傳它們。
如何把使用者搬到另一個 Firebase 專案?
在舊專案執行 firebase auth:export users.json,再在新專案執行 firebase auth:import users.json,並加上 --hash-algo=SCRYPT,以及舊專案密碼雜湊參數(Password hash parameters)中的雜湊金鑰、鹽值分隔符、輪數和記憶體成本。若使用不含雜湊的檔案(來自 Firexport 或指令碼),每位以密碼登入的使用者都得重設密碼。
可以在 Excel 或 Google 試算表中開啟匯出的檔案嗎?
可以。這裡的每種方法都會寫出 CSV,兩者都能開啟。Firexport 和指令碼產生的 CSV 都以位元組順序標記開頭,所以 Excel 能正確讀取任何語言的名稱。如果在沒有位元組順序標記的 CSV 中名稱變成亂碼,請透過資料 > 從文字/CSV(Data > From Text/CSV)匯入,並把檔案原點(File Origin)設為 65001: Unicode (UTF-8)。
