はじめに
Firebase admin SDKを使うと、Firebase Authenticationで認証されたユーザーのuidをできるだけ認証情報を維持したまま、無理やり変更することができました。もしご利用になる場合は、何をやっているか理解した上で、自己責任でやってください。
流れ
uidがbefore
になっているユーザーをafter
に変えたいとしましょう。やることの大枠は3ステップです。
-
before
の情報をFirebase Authenticationから取得する -
before
をFirebase Authenticationから削除する。after
がすでに使われている場合はafter
も削除する。 - 1で取得した
before
の情報を、after
としてFirebase Authenticationにimportする
2.でbefore
やafter
を削除していることに注意してください。
実装
今回はTypeScriptで書いていきます。
import * as admin from 'firebase-admin'
const auth = admin.auth()
const beforeUid = 'before'
const afterUid = 'after'
const beforeUserRecord = await auth.getUser(beforeUid)
await auth.deleteUser(beforeUid)
await auth.deleteUser(afterUid) // if need
await auth.importUsers([{
uid: afterUid,
email: beforeUserRecord.email,
phoneNumber: beforeUserRecord.phoneNumber,
providerData: beforeUserRecord.providerData,
// set more fields if need
}])
キモはbefore
のproviderData
、すなわち認証情報をafter
にセットしている部分です。これにより一部を除く認証情報が引き継がれます。細かい仕様は公式ドキュメントをご参照ください。
注意点
パスワード認証は引き継げない
👆で「一部を除く認証情報が引き継がれる」と書きました。上記の実装だとSign in with Apple含めた外部IdPによる認証や電話番号認証は引き継げるものの、メアドパスワード認証(providerDataのproviderIdがpassword
のもの)の認証情報は引き継げません。これも引き継げるようにしようと思うと一工夫必要になってきます。
具体的な実装は省きますが勘所を書いておきます。公式ドキュメントのImport users with Firebase SCRYPT hashed passwordsも参考になります。
- importUsersに
passwordHash
やHashアルゴリズムなどの情報を渡す必要があります -
passwordHash
はドキュメントによるとauth.listUsers()
で取ってこれると書いてあるが実際にはなぜか取得できないので、CLIで取得する。firebase auth:export -P your_project_id users.csv
で取得できます。 - 2で取得したcsvから対象のユーザーのpasswordHashやpasswordSaltを取得する
- Firebase ConsoleのAuthenticationの三点リーダーを押してパスワードハッシュパラメータを取得し、importUsersに3と合わせて渡す
emailやphoneNumberの重複があってもimportできてしまう
公式ドキュメントのUsageにこう書いてあります。Firebase Authenticationはクライアントからのユーザー作成時はemailなどのUniqueであるべきフィールドが重複しているとエラーになります。ですがimportUsers
はその重複チェックを行なってくれないようです。気をつけましょう。
Importing a user with any other field duplicated (e.g. email) will result in an additional user with the same value. Consequently, when you use this API, you must ensure that you do not duplicate any unique fields.
クライアントのハンドリングについて
before
は消えてしまいますので、クライアント側の実装方法によっては予期せぬ状態になってしまうことがあるでしょう。基本的にはログアウトさせて、再度ログインさせるとよいです。uidがafter
になっているはずです。
おわりに
用法用量を守ってご利用ください。よかったらTwitterフォローしてください👇
Firebase Authenticationで認証したユーザーのuidを変更する https://t.co/CoAxXPbJ8p #Qiita
— moga🍳 (@_mogaming) September 8, 2020
書いた!