Firebase Authenticationの多要素認証ハマりどころ

こんにちは。長堂です。

ちいき資本主義事業部まちのコインアプリのFlutterエンジニアをしているボディビルダー techblog.kayac.com

です。

今回はFirebase Authenticationで多要素認証対応をした際にハマってしまったところなどを書いていきます。

背景

まちのコインではユーザー認証にFirebase Authenticationを利用していて、 認証方法としてGoogleやFacebookなど各サードパーティによる認証、または、メールとパスワードによる認証を提供しています。

また、SMSによる二段階認証にも対応しており、こちらはTwilioが提供しているAuthy APIを利用して実装していました。

しかしAuthy APIがdeprecatedとなり、移行先としてTwilioから案内されているVerify APIに移行するか別のモノに置き換える必要が出てきました。

Verify vs. Authy | Twilio

どうしてFirebase Authenticationではなく、Authy APIで多要素認証が実装されていたのでしょうか?

理由はシンプルに、まちのコインに二段階認証を実装した当時はFirebase Authenticationに多要素認証機能がなかったためです。

(※Firebase Authenticationの多要素認証機能は2022年7月から使えるようになっています) firebase.blog

Firebase Authenticationの多要素認証機能で要件を十分満たせる、かつ、認証周りをFirebase Authenticationに統一できる、ということで、Firebase Authenticationで多要素認証を再実装することにしました。

Firebase Authenticationの多要素認証ハマりどころ

さて、ここからが本題です。Firebase Authenticationで多要素認証を実装した際にハマったポイントをご紹介していきます。

Facebookで登録したユーザーのメールアドレスが確認済みemailVerified == trueとならない

こちらはFirebase Authenticationのドキュメントflutterfireのissueにも記載がありますが、FacebookプロバイダーがFirebaseに信頼できるプロバイダーとして認められていないことが原因のようです。

ドキュメントを読む限り、信頼されていないプロバイダーはFacebookだけのようです。どうしてでしょうか。。

emailVerified == false、つまり、メールアドレス未確認のユーザーは多要素認証を利用することができません。

具体的には、enrollで多要素認証をONにしようとするとエラーコードunverified_emailが返ってきます。この場合、sendEmailVerification、または、verifyBeforeUpdateEmailでユーザーにメールアドレスの確認を促す必要があります。

FirebaseAuthExceptionの確認がし辛い

例えば、多要素認証時にユーザーがSMSで送信されたコードを誤入力した場合にFirebaseAuthExceptionがthrowされます。

FirebaseAuthExceptionのエラーコードを確認することでユーザーに表示するべきメッセージの有無や、実装に間違いがあるのかなど判断することができます。

が、Debugビルド時はこのエラーコードが全てFirebaseAuthInvalidCredentialsExceptionで返ってくる、という現象が起きました。これに関してはissueも上がっておらず、原因がよくわかっていません。

とりあえず、確認したいエラーコードはReleaseビルドで実際にエラーを発生させて確認することで解決したのですが、Debugビルドで確認できないのはFirebase側の不具合かもしれません。。。

引き続き調査してみて、FlutterFireにissueを立てて問い合わせてみようと思っています。

まとめ

  • まちのコインの多要素認証で利用していたTwilio Authy API を廃止し、 Firebase Authentication で再実装した
  • そこでハマった主なポイントが2つ
    • Firebase Authentication は Facebook をログインプロバイダーとして信頼していないため、ユーザーにメールアドレスの確認を求める必要がある
    • Debugビルド時に多要素認証関連のエラーコードが全てFirebaseAuthInvalidCredentialsExceptionで返ってくることがある

以上です。

カヤックではFlutterやFirebaseに詳しい、または、興味のあるエンジニアを募集しております。切実に。

www.kayac.com

まちのコインを使えばダイエットやトレーニングのご相談も受けられますので、お待ちしております。

coin.machino.co