🐙

【同じこと繰り返すなTips】FirebaseAuthで匿名ログインしたユーザーのデータがリセットされる

2024/11/06に公開

環境

  1. Firebase Authentication
  2. Flutter
  3. dart
  4. iOS/Android

事象

匿名ログインでアプリを使用していたユーザーが新しいバージョンに毎回アップデートすると以下の事象が発生しました。

  • アップデート前: 普通にアプリを使用できていた
  • アップデート後: ログイン画面に戻されてしまい再度ログインしないといけない
    • 匿名ログインだったためメールアドレスの紐付けなどを行なっておらずアップデート前のデータが戻らなくなった

事象が発生した理由

Firebase関連のパッケージバージョンを更新したためか、何らかの理由でセッション情報がリセットされました。
そして、セッション情報がリセットされたため、新しいUIDを生成してしまいログインできなくなるという事象が起きました。

同じ事象を起こさないようにするには?

UIDがリセットされて新しいUIDが発行された場合でも、DeviceIDをチェックすることで、同じデバイス上で同じユーザーとしてデータを扱うことが可能になります。

また、DeviceID以外にもUUIDを使用することで万が一、セッション情報が損失してもユーザーのデータを復元してログインできるようにすることも可能だと思います。
ですが、私は以下の観点でDeviceIDが一番良いのでは?と考えております。

結論、一番不変なデータだからです。
UUIDの場合、ライブラリをまず使用することになります。
その場合、もしUUIDがリセットされた場合(ライブラリの仕様変更やキャッシュ削除など)に別ユーザーとしてFirebase側が認識する可能性もあるため。(リスクとしては少ないが)

DeviceIDにもデメリットがある

  • Flutterアプリの場合、各OSのDeviceIDを取得する必要があります。
  • プライバシーな情報になる。
    • 最近では、プライバシーな情報を取得した場合、明確にしないといけなかったりして厳しくなっている点です。リジェクトの可能性が上がったりしてしまいますね…

処理フロー

以下のような処理をすれば、セッション情報がリセットされても匿名ログインしているユーザーがデータを損失することなく、アプリを使い続けることができると思います。

※ マーメイド形式のシーケンス図になります

まとめ

今回の学びは以下です

  1. 匿名ユーザーには、一部の機能を制限することでGoogleやFacebookなどの永続的な設定をしてもらえるように促す
  2. 匿名ユーザーでログインしていてアプリを消してなくても、セッション情報がリセットされることはある。
  3. DeviceIDやUUIDを使用して万が一のためにユーザーを特定できるデータを保存しておく

私のような同じ過ちを犯さないように引き続きアプリ開発を頑張ってください!

Discussion