😽

Firebaseのメールリンク認証とパスワード認証を併用するとパスワード認証ができなくなる

2023/05/18に公開

はじめに

今携わっている案件のアプリでは、Firebaseのメールリンク認証を使用しているのですが、微妙なハマりポイントがあったので記事にしておこうと思います。

事象が発生したアプリについて

・Firebaseのパスワード認証にてメールリンク認証オプションをオンにしている
・アプリにユーザーの新規登録導線はなく、ユーザー作成はこちらから行ってユーザーにアカウントを払い出している。
・アプリにはユーザー向けのメールリンク認証の導線の他に内部用にパスワード認証の動線がある

事象

メールリンク認証をした後、同じアカウントで内部用の導線からパスワード認証をしようとしたところ、ログインエラーが発生しました。

原因

原因はFirebaseの公式ドキュメントにちゃんと記載がありました。

ログインが完了すると、未確認のログインはすべて破棄され、既存のセッションが無効になります。たとえば、未確認のアカウントが同じメールとパスワードですでに作成されている場合、所有者を装って未確認アカウントを作成した人物が未確認のメールアドレスとパスワードでログインできないように、ユーザーのパスワードが削除されます。

セキュリティの観点からメールアドレス未確認のアカウントでメールリンク認証した場合はパスワードが削除されるということですね。
ということでアカウントに対してコンソールやAPIからパスワード再設定を行えばまた問題なくパスワード認証できるようになります。
また、メールリンク認証で一度認証した時点でメールアドレス確認済み(User.emailVerifiedがtrueになる)とみなされるようで再度メールリンク認証をしてもパスワードが削除されることはありません。

最後に

今回のケースはアプリに新規登録の導線がなく、それによってメールアドレスの確認を行う工程(メール送信して確認リンクを踏んでもらう)がなかったことにより、基本的にアカウントがメールアドレス未確認状態になっていたことでぶち当たった事象だと思います。
なので、一般的なアプリでは問題になることは少ないかもしれませんが、誰かの役に立てばいいなと思い、共有させていただきます。
ちゃんとドキュメントは読もう(自戒)

GitHubで編集を提案

Discussion