搬遷 firebase auth user 至另一個firebase專案

前言

若firebase專案與GCP專案有綁定
而服務架設在GAE上,但想要更換GAE地區時
就會遇到這個問題

因為現行GAE建立後是無法刪除的,亦無法更換地區
若要更換,只能重建專案、重新啟用新的GAE

若使用到GCP的功能少,更換的過程其實不難
服務部署完畢後,域名綁定過去即可

但服務有透過firebase接第三方登入的話,問題就出現了!

firebase似乎是無法轉換專案,連帶著須重新建立一個新的firebase
而因密碼雜湊參數不同,原本同一user登入時,會出現不同的uid
就會影響自身DB儲存的firebase uid

導致現行的登入流程無法正確取得user而登入失敗

最好的作法就是轉移firebase auth user,並將其密碼雜湊參數設成一樣
程式面僅須更新firebase json及前端的firebase參數,達到無痛轉換!

明明只要單純在firebase上增加匯出、匯入、編輯密碼雜湊功能就可以很簡單完成的工作
但Google卻沒這麼做= =…只能透過指令手動搬家

作法

一、安裝firebase-tool 與登入

  1. 打開終端機,安裝firebase-tools -> npm install -g firebase-tools
  2. 登入您的帳號 -> firebase login

二、匯出user

  1. CD到作業的目錄,因須產生實體檔案
1
cd ~/desktop/firebase
  1. 匯出user
1
firebase --project <來源firebase專案> auth:export users.json --format=json
  1. 取得密碼雜湊參數
    打開網頁,進入firebase <來源firebase專案>
    Authentication -> Users -> user列表右上方的開啟選單 -> 密碼雜湊參數
    複製出來

他會長這個樣子

1
2
3
4
5
6
7
hash_config {
algorithm: SCRYPT,
base64_signer_key: <SIGNER_KEY>,
base64_salt_separator: <SALT_SEPARATOR>,
rounds: <數字>,
mem_cost: <數字>,
}

三、匯入user

  1. 打開firebase官方頁面 -> 身份驗證:導入和身份驗證:導出#身份驗證:導入
  2. 底下的firebase auth:import ...程式碼片段裡的 value 是可以編輯的,於此處輸入檔名、前面複製出來的hash_config內容
  3. 輸入完畢後複製出來,於最前面補上--project <目的firebase專案>,並將沒用到的欄位刪掉。最終指令如下:
1
2
3
4
5
6
firebase --project <目的firebase專案> auth:import users.json    \
--hash-algo=SCRYPT \
--hash-key=<SIGNER_KEY> \
--salt-separator=<SALT_SEPARATOR> \
--rounds=<數字> \
--mem-cost=<數字> \

注意!
複製出來的hash_config是json,所以每個欄位後面都會有,,但終端機裡的指令不應有,
若加上去了,那最後產出來的uid仍會不同!

  1. 靜待指令執行完成後,即匯入成功!

四、服務的前端、後端更新json、參數

回到程式面
將後端使用的json、前端使用的參數更換成<目的firebase專案>、部署
若有重新綁定域名需求,再綁定成新的位置

大功告成!