こんにちは。長堂です。
ちいき資本主義事業部でまちのコインアプリのFlutterエンジニアをしているボディビルダー techblog.kayac.com
です。
今回はFirebase Authenticationで多要素認証対応をした際にハマってしまったところなどを書いていきます。
背景
まちのコインではユーザー認証にFirebase Authenticationを利用していて、 認証方法としてGoogleやFacebookなど各サードパーティによる認証、または、メールとパスワードによる認証を提供しています。
また、SMSによる二段階認証にも対応しており、こちらはTwilioが提供しているAuthy APIを利用して実装していました。
しかしAuthy APIがdeprecatedとなり、移行先としてTwilioから案内されているVerify APIに移行するか別のモノに置き換える必要が出てきました。
どうして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に詳しい、または、興味のあるエンジニアを募集しております。切実に。
まちのコインを使えばダイエットやトレーニングのご相談も受けられますので、お待ちしております。