LoginSignup
23
18

More than 3 years have passed since last update.

Firebase Authenticationの認証情報を維持したままユーザーのuidを変更する

Last updated at Posted at 2020-09-08

はじめに

Firebase admin SDKを使うと、Firebase Authenticationで認証されたユーザーのuidをできるだけ認証情報を維持したまま、無理やり変更することができました。もしご利用になる場合は、何をやっているか理解した上で、自己責任でやってください。

流れ

uidがbeforeになっているユーザーをafterに変えたいとしましょう。やることの大枠は3ステップです。

  1. beforeの情報をFirebase Authenticationから取得する
  2. beforeをFirebase Authenticationから削除する。afterがすでに使われている場合はafterも削除する。
  3. 1で取得したbeforeの情報を、afterとしてFirebase Authenticationにimportする

2.でbeforeafterを削除していることに注意してください。

実装

今回はTypeScriptで書いていきます。

changeUid.ts
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
}])

キモはbeforeproviderData、すなわち認証情報をafterにセットしている部分です。これにより一部を除く認証情報が引き継がれます。細かい仕様は公式ドキュメントをご参照ください。

注意点

パスワード認証は引き継げない

👆で「一部を除く認証情報が引き継がれる」と書きました。上記の実装だとSign in with Apple含めた外部IdPによる認証や電話番号認証は引き継げるものの、メアドパスワード認証(providerDataのproviderIdがpasswordのもの)の認証情報は引き継げません。これも引き継げるようにしようと思うと一工夫必要になってきます。

具体的な実装は省きますが勘所を書いておきます。公式ドキュメントのImport users with Firebase SCRYPT hashed passwordsも参考になります。

  1. importUsersにpasswordHashやHashアルゴリズムなどの情報を渡す必要があります
  2. passwordHashドキュメントによるとauth.listUsers()で取ってこれると書いてあるが実際にはなぜか取得できないので、CLIで取得する。firebase auth:export -P your_project_id users.csvで取得できます。
  3. 2で取得したcsvから対象のユーザーのpasswordHashやpasswordSaltを取得する
  4. Firebase ConsoleのAuthenticationの三点リーダーを押してパスワードハッシュパラメータを取得し、importUsersに3と合わせて渡す スクリーンショット 2020-09-08 10.25.55.png

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フォローしてください👇

23
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
18