>_tech-draft
Firebaseのアイコン
Firebase
動画公開日
タイトル

Tap to verify: No SMS, no Friction with Firebase Phone Number Verification

再生時間

5分

SMS OTPはもう古い!Firebase電話番号認証でアプリのセキュリティを強化する究極ガイド

ポイント

  • SMS OTPの安全性とコストの課題を抱えるアプリ開発者向けに、次世代の認証ソリューションを紹介します。
  • Firebase電話番号認証(PNV)が、キャリアと直接連携し、SMSを介さずに高セキュリティでシームレスなユーザー認証を実現する仕組みを解説。
  • Androidアプリへの具体的な導入手順から、フィッシング詐欺を防ぐサーバーサイド検証までを網羅し、アプリのセキュリティとユーザー体験を向上させるための実践的な知見を提供します。

導入:SMS OTPの危険性とFirebase PNVの登場

ユーザー認証に依然としてSMSベースのワンタイムパスワード(OTP)を利用されている場合、それは非常に危険でコストのかかる戦略を採っていることになります。SMS OTPは、以下のようないくつかの深刻な問題点を抱えています。

  • 低速かつ不安定: テキストメッセージの送信は時間がかかることがあり、電波状況の悪いエリアでは配信に失敗することがあります。
  • フィッシング詐欺のリスク: ユーザーはフィッシング攻撃に対して無防備になりやすく、不正なサイトでOTPが盗まれる可能性があります。
  • SMS Pumping Fraud: ボットファームが多数のOTPテキストを高コストな国に送信し、プロバイダーに莫大な請求が発生する詐欺のリスクがあります。

しかし、SIMカードからキャリア経由で電話番号を直接検証し、シングルタップで2秒以内に認証を完了できる方法があるとしたらどうでしょうか?本記事では、この課題を解決するモバイル認証の第三世代である「Firebase電話番号認証(PNV)」について詳しく解説します。Android 8以降のデバイスで利用可能で、皆様のアプリケーションのセキュリティを劇的に向上させることができます。

Firebase電話番号認証(PNV)の仕組み

Firebase PNVは、一般的なSMS認証とは根本的に異なるアプローチを採用しています。従来のSMS認証が「ユーザーがテキストメッセージを受信できる」ことしか証明できないのに対し、Firebase PNVは、実際のテキストメッセージを送信することなく機能します。

  • キャリアへの直接問い合わせ: モバイルネットワークオペレーターに対し、デバイスに挿入されているSIMカードに割り当てられた電話番号を直接問い合わせます。これにより、中間者攻撃のリスクを排除します。
  • 高いセキュリティとシームレスな体験: テキストメッセージが送信されないため、コードが傍受される機会がゼロになり、SMS料金詐欺の発生源もなくなります。ユーザーは手間なくスムーズに認証を完了できます。
  • Blazeプランの要件: PNVはモバイルネットワークキャリアと直接通信するため、本番環境で利用するにはFirebaseのBlazeプラン(請求アカウント)が必要です。ただし、ご安心ください。
  • 開発用のシームレスなテストモード: 開発中は、請求アカウントなしで、アプリケーションのユーザーエクスペリエンス全体をビルド、テスト、プロトタイプ作成できるシームレスなテストモードが提供されています。これにより、コストを気にせず開発を進めることができます。

開発環境のセットアップ

それでは、Firebase PNVをアプリケーションに組み込むための具体的な手順を見ていきましょう。

1. Firebase PNV依存関係の追加

まず、プロジェクトのbuild.gradle.ktsファイルを開き、Firebase PNVライブラリの依存関係を追加します。すべてのライブラリの互換性を保つために、Firebase Android BOMバージョン34.11.0を使用することをお勧めします。

2. Firebaseコンソールでのテストトークン生成

開発中にシームレスなテストモードを利用するためには、テストトークンを生成する必要があります。以下の手順でトークンを取得します。

  1. Firebaseコンソールにアクセスします。
  2. 左側のナビゲーションメニューから「セキュリティ」を選択し、「電話番号認証」に進みます。
  3. 「Testing」タブを選択し、テストに使用する国コードを選択します。
  4. 「Generate Token」ボタンをクリックすると、一時的なテストトークン文字列が生成されます。これをコピーしてください。

注意点: これらのテストトークンには7日間の有効期限があります。必要に応じていつでも新しいトークンを生成できます。このトークンは、CI/CDパイプライン、ローカルエミュレーター、または物理テストデバイスでのテストに最適です。

3. Android Studioでのテストトークン使用

Android Studioでアプリケーションのコードを開き、以下の手順でテストトークンを使用します。

  1. FirebasePhoneNumberVerificationクラスのインスタンスを作成します。
  2. コピーしたテストトークンを引数として渡し、enableTestSessionメソッドを呼び出します。これにより、テストモードが有効になります。

実装の詳細

次に、実際のアプリケーションコード内でのPNVの実装方法について説明します。

1. ライブラリの初期化とサポート確認

Firebase PNVライブラリをインスタンス化した後、UIをトリガーする前に、ユーザーのSIMカードとキャリアがFirebase PNVをサポートしているかどうかを確認することがベストプラクティスです。これは、getVerificationSupportInfoメソッドを呼び出すことで行います。これにより、サポートされていない環境で不必要なUIを表示するのを防ぐことができます。

2. 電話番号認証のトリガー

キャリアがFirebase PNVをサポートしていることが確認されたら、getVerifiedPhoneNumberメソッドを呼び出します。このメソッドが呼び出されると、AndroidのCredential Managerが起動し、ユーザーの同意を求めるクリーンでネイティブなシングルタップのボトムシートが画面下部に表示されます。ユーザーが同意をタップすると、Google Playサービスがキャリアと安全に通信し、署名済みのトークン結果をアプリケーションに返します。

3. 結果の取得

認証が正常に完了すると、result.getPhoneNumber()メソッドで検証済みの電話番号を、result.getToken()メソッドで安全な署名済みトークンを抽出できます。

サーバーサイドでのトークン検証

セキュリティ警告: クライアントサイドで取得した電話番号やトークンを単独で信頼してはなりません。悪意のあるアクターが電話番号を偽装するのを防ぐため、以下のサーバーサイドでの検証が必須となります。

  1. トークンのバックエンド送信: クライアントから取得した署名済みトークンをバックエンドサーバーに送信します。
  2. 署名の検証: サーバー上で、そのトークンの署名をGoogleの公開JWKS(JSON Web Key Set)キーに対して検証します。
  3. 詳細な検証: さらに、トークンの発行者(issuer)がご自身のFirebaseプロジェクト番号と一致しているか、およびトークンが有効期限切れでないことを検証します。

幸いなことに、Firebase Admin SDKは、Node.js、Java、Python、Goなどの言語で利用可能なverifyTokenコールを提供しており、これらすべての検証プロセスを自動的に実行してくれます。トークンがサーバーで正常に検証されたら、そのユーザーを安全にアプリケーションにサインインさせることができます。

本番環境への移行

開発が完了し、本番環境にデプロイする準備が整ったら、非常に簡単な手順で移行できます。

  • テストモードの無効化: 開発中にenableTestSessionを呼び出していた行を削除するだけです。これにより、アプリケーションは本番環境での認証フローに切り替わります。
  • トラフィックの監視: アプリケーションの稼働後は、Cloud Monitoringを使用して、Firebase PNVの成功率とキャリアの可用性を監視し、認証フローがスムーズに機能しているかを確認することができます。

まとめ

Firebase電話番号認証を導入することで、わずか数行のコードで、非常に安全かつ摩擦のない電話番号認証フローをアプリケーションに実装できます。これにより、以下のメリットを享受できます。

  • セキュリティの向上: フィッシング詐欺によるワンタイムパスワードの悪用リスクを排除します。
  • ユーザーエクスペリエンスの改善: 煩わしい手動でのSMS入力は不要になり、ユーザーはスムーズに認証を完了できます。
  • コスト削減: SMS Pumping Fraudによる予測不能な請求から解放されます。

Firebase PNVは、直接的なキャリアレベルの信頼性を提供し、あらゆるインターネット接続で機能します。もし、オンボーディングプロセスのセキュリティを強化したいと考えているなら、ぜひ今日からFirebase電話番号認証の導入をご検討ください。詳細なドキュメントやサンプルコードは公式ページをご確認ください。


参考動画: [https://www.youtube.com/watch?v=A8zq0xfXlvY]