Android で Firebase 電話番号確認を使ってみる

このページでは、Android アプリで Firebase Phone Number Verification を使用する方法について説明します。この機能の概要については、概要をご覧ください。

このページでは、統合されたシングルコール API を使用して Firebase PNV と統合する方法について説明します。1 つのメソッドを呼び出すと、ユーザーの同意の取得から Firebase PNV バックエンドへの必要なネットワーク呼び出しまで、Firebase PNV ユーザーフロー全体が処理されます。このメソッドを使用すると、統合手順が 1 回のメソッド呼び出しに短縮されます。

この API はほとんどのデベロッパーにおすすめですが、ライブラリで満たされない特定の要件がある場合は、Firebase Phone Number Verification フローをカスタマイズするページでカスタム フローの実装についてご確認ください。

始める前に

アプリのプライバシー ポリシーを一般公開のウェブサイトで公開する必要があります。このページでは、Firebase Phone Number Verification を使用して取得した電話番号をどのように使用するかをユーザーに説明する必要があります。Firebase PNV ライブラリは、ユーザーにアプリとの電話番号の共有の同意を求める際に、このページにリンクします。

1. Firebase プロジェクトを設定する

  1. Firebase を Android プロジェクトに追加します(まだ行っていない場合)。

  2. Firebase PNV には Blaze プランが必要です。プロジェクトを従量課金制の Blaze 料金プランにまだアップグレードしていない場合は、アップグレードします。

    Firebase PNV では Firebase プロジェクトに請求先アカウントを関連付ける必要がありますが、プレビュー段階ではサービスの料金は請求されません。

  3. Firebase コンソールでアプリの SHA-256 フィンガープリントを指定していない場合は、プロジェクトの設定で指定します。アプリの SHA-256 フィンガープリントを取得する方法の詳細については、クライアントの認証をご覧ください。

  4. Google Cloud コンソールで Firebase プロジェクトを開き、Firebase Phone Number Verification API を有効にします

  5. コンソールの [認証情報] ページで、Android API キーを開き、選択した API のリストに Firebase Phone Number Verification API を追加します。

2. アプリに Firebase PNV ライブラリを追加します。

モジュール(アプリレベル)の Gradle ファイル(通常は <project>/<app-module>/build.gradle.kts または <project>/<app-module>/build.gradle)に、Android 用 Firebase Phone Number Verification ライブラリの依存関係を追加します。

dependencies {
    // Add the dependency for the Firebase Phone Number Verification library
    implementation("com.google.firebase:firebase-pnv:16.0.0-beta01")
}

3. 省略可: Firebase PNV のサポートを確認する

確認フローを開始する前に、デバイスとその SIM カードが API ベースの電話番号確認をサポートしているかどうかを確認できます。これは、ユーザーの同意を必要としない事前チェックです。このテストの結果を使用して、Firebase PNV フローを開始するか、SMS などの電話番号確認の代替方法を使用するかを判断できます。

デバイスの互換性を確認するには、getVerificationSupportInfo() メソッドを呼び出します。

Kotlin

import com.google.firebase.pnv.FirebasePhoneNumberVerification
// Get an instance of the SDK.
val fpnv = FirebasePhoneNumberVerification.getInstance()

// Check all SIMs for support.
fpnv.getVerificationSupportInfo()
  .addOnSuccessListener { results ->
    if (results.any { it.isSupported() }) {
      // At least one SIM is supported; proceed with FPNV flow
    } else {
      // No SIMs are supported, so fall back to SMS verification.
    }
  }
  .addOnFailureListener { e ->
    // Handle error.
  }

getVerificationSupportInfo() は、SIM スロットごとに 1 つの VerificationSupportResult オブジェクトのリストを返します。少なくとも 1 つの SIM カードがサポートされている場合は、Firebase PNV フローに進むことができます。

4. 確認フローを開始する

Firebase PNV フローを開始するには、Activity コンテキストを渡して FirebasePhoneNumberVerification の新しいインスタンスを作成します。SDK がユーザーに同意画面を表示するには、Activity コンテキストが必要です。次に、オブジェクトの getVerifiedPhoneNumber() メソッドを呼び出します。

Kotlin

// Get an instance of the SDK _with an Activity context_:
val fpnv = FirebasePhoneNumberVerification.getInstance(this@MainActivity)

// Call getVerifiedPhoneNumber
fpnv.getVerifiedPhoneNumber("https://example.com/privacy-policy")
  .addOnSuccessListener { result ->
    val phoneNumber = result.getPhoneNumber()
    val token = result.getToken()
    // Verification successful. Send token to your backend.
  }
  .addOnFailureListener { e ->
    // Handle failures, such as the user declining consent or a network error.
  }

getVerifiedPhoneNumber() メソッドは、次のものを含む電話番号の確認フロー全体を実行します。

  • Android Credential Manager を使用して、電話番号の共有に関するユーザーの同意を取得します。
  • Firebase PNV バックエンドにリクエストを送信します。
  • デバイスの確認済みの電話番号を返します。

5. Firebase PNV トークンを使用する

フローが成功すると、getVerifiedPhoneNumber() メソッドは確認済みの電話番号と、その電話番号を含む署名付きトークンを返します。このデータは、プライバシー ポリシーに記載されているとおりにアプリで使用できます。

アプリ クライアントの外部で確認済みの電話番号を使用する場合は、電話番号自体ではなくトークンを渡して、使用時に完全性を確認できるようにする必要があります。トークンを検証するには、任意の JWT 検証ライブラリを使用できます。ライブラリを使用して、次のすべてを確認します。

  • トークンは、Firebase PNV JWKS エンドポイントで公開されている鍵のいずれかを使用して署名されます。

    https://fpnv.googleapis.com/v1beta/jwks
    
  • オーディエンスと発行者のクレームには Firebase プロジェクト番号が含まれており、次の形式になっています。

    https://fpnv.googleapis.com/projects/FIREBASE_PROJECT_NUMBER
    

    Firebase プロジェクト番号は、Firebase コンソールの [プロジェクトの設定] ページで確認できます。

  • トークンの有効期限が切れていない。

簡単な例として、次の Express.js アプリは HTTP POST リクエストから Firebase PNV トークンを受け取り、JWT 検証ライブラリを使用してトークンの署名とクレームを確認します。

Node.js

import express from "express";
import { JwtVerifier } from "aws-jwt-verify";

// Find your Firebase project number in the Firebase console.
const FIREBASE_PROJECT_NUMBER = "123456789";

// The issuer and audience claims of the FPNV token are specific to your
// project.
const issuer = `https://fpnv.googleapis.com/projects/${FIREBASE_PROJECT_NUMBER}`;
const audience = `https://fpnv.googleapis.com/projects/${FIREBASE_PROJECT_NUMBER}`;

// The JWKS URL contains the current public signing keys for FPNV tokens.
const jwksUri = "https://fpnv.googleapis.com/v1beta/jwks";

// Configure a JWT verifier to check the following:
// - The token is signed by Google
// - The issuer and audience claims match your project
// - The token has not yet expired (default behavior)
const fpnvVerifier = JwtVerifier.create({ issuer, audience, jwksUri });

const app = express();

app.post('/verifiedPhoneNumber', async (req, res) => {
    if (!req.body) return res.sendStatus(400);
    // Get the token from the body of the request.
    const fpnvToken = req.body;
    try {
        // Attempt to verify the token using the verifier configured above.
        const verifiedPayload = await fpnvVerifier.verify(fpnvToken);

        // If verification succeeds, the subject claim of the token contains the
        // verified phone number. You can use this value however it's needed by
        // your app.
        const verifiedPhoneNumber = verifiedPayload.sub;
        // (Do something with it...)

        return res.sendStatus(200);
    } catch {
        // If verification fails, reject the token.
        return res.sendStatus(400);
    }
});

app.listen(3000);

Firebase アプリにログインする

Firebase Authentication ログインフローで Firebase PNV トークンを使用する例については、Firebase Phone Number Verification を使用して Firebase で認証するをご覧ください。