Unity で電話番号を使用して Firebase 認証を行う

Firebase Authentication を使用すれば、ユーザーのスマートフォンに SMS メッセージを送信することによってユーザーをログインさせることができます。ユーザーは SMS メッセージに記載されたワンタイム コードを使用してログインします。

このドキュメントでは、Firebase SDK を使用して電話番号ログインのフローを実装する方法について説明します。

準備

  1. Firebase を Unity プロジェクトに追加します
  2. アプリを Firebase プロジェクトにまだ接続していない場合は、Firebase コンソールで接続します。

iOS で電話番号ログインを行うには、物理端末が必要です。シミュレータでは機能しません。

セキュリティに関する懸念

電話番号の所有権はユーザー間で簡単に移転できるため、電話番号のみを使用する認証は、便利である反面、セキュリティ面では他の認証方法より劣ります。また、複数のユーザー プロフィールを持つ端末では、SMS メッセージを受信できるすべてのユーザーが、端末の電話番号を使用してアカウントにログインできます。

アプリで電話番号ベースのログインを使用する場合は、よりセキュリティの高いログイン方法も同時に提供し、電話番号ログインを使用した場合のセキュリティ面での懸念をユーザーに通知する必要があります。

Firebase プロジェクトで電話番号ログインを有効にする

SMS を介してユーザーをログインさせるには、まず Firebase プロジェクトで電話番号ログイン方法を有効にする必要があります。

  1. Firebase コンソールで [Authentication] セクションを開きます。
  2. [ログイン方法] ページで、[電話番号] のログイン方法を有効にします。

Firebase の電話番号ログイン リクエストの割り当ては多めになっており、ほとんどのアプリはこれで十分です。ただし、大量のユーザーを電話認証でログインさせる場合は、料金プランをアップグレードしなければならないことがあります。料金ページをご覧ください。

APN 通知の受信を開始する(iOS のみ)

iOS で電話認証を使用するには、アプリが Firebase から APN 通知を受信する必要があります。ユーザーが端末で初めて電話番号を使用してログインすると、Firebase Authentication は端末にサイレント プッシュ通知を送信し、電話番号のログイン リクエストがアプリから来ていることを確認します。このため、電話番号のログインでは、シミュレータを使用できません。

Firebase Authentication で APN 通知を有効にするには:

  1. Xcode で、プロジェクトのプッシュ通知を有効にします
  2. APN 証明書を Firebase にアップロードします。まだ APNs 証明書を用意していない場合は、APNs の SSL 証明書のプロビジョニング手順を確認してください。

    1. Firebase コンソールのプロジェクト内で歯車アイコンを選択し、[プロジェクトの設定]、[クラウド メッセージング] タブの順に選択します。

    2. 開発用証明書、本番用証明書、またはその両方の [証明書をアップロード] ボタンを選択します。少なくとも 1 つ選択する必要があります。

    3. 証明書ごとに .p12 ファイルを選択し、必要に応じてパスワードを入力します。この証明書のバンドル ID はアプリのバンドル ID と一致させてください。[保存] を選択します。

ユーザーのスマートフォンに確認コードを送信する

電話番号ログインを開始するには、電話番号の入力を求めるインターフェースをユーザーに表示した後、PhoneAuthProvider.VerifyPhoneNumber を呼び出し、Firebase が SMS でユーザーのスマートフォンに認証コードを送信するように要求します。

  1. ユーザーの電話番号を取得します。

    法的要件はさまざまに異なりますが、電話番号ログインを使用する場合は確認用の SMS メッセージが送られること、またそれには標準料金がかかることをユーザーに知らせるのがベスト プラクティスであり、ユーザーにあらかじめ心づもりをしてもらうことにもつながります。

  2. PhoneAuthProvider.VerifyPhoneNumber を呼び出し、ユーザーの電話番号を渡します。
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(phoneNumber, phoneAuthTimeoutMs, null,
      verificationCompleted: (credential) =&gt {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) =&gt {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) =&gt {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) =&gt {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    
    PhoneAuthProvider.VerifyPhoneNumber を呼び出すと、Firebase が次の処理を行います。
    • (iOS の場合)アプリにサイレント プッシュ通知を送信します。
    • Firebase が指定された電話番号に認証コードを含む SMS メッセージを送信し、確認 ID を補完関数に渡します。ログインするには、確認コードと確認 ID の両方が必要です。
  3. 確認 ID を保存し、アプリの読み込み時に復元します。これにより、ユーザーがログインフローを完了する前にアプリが終了した場合でも(たとえば SMS アプリへの切り替え時など)、有効な確認 ID を残すことができます。

    確認 ID は任意の方法で保存できます。UnityEngine.PlayerPrefs で確認 ID を保存するのが簡単な方法です。

codeSent に渡されたコールバックが呼び出された場合、ユーザーが SMS メッセージを受信したときに確認コードの入力を促すこともできます。

また、verificationCompleted のコールバックが呼び出された場合は自動検証が成功しており、Credential が取得されます(使用方法は後で説明します)。

確認コードを使ってユーザーをログインさせる

ユーザーが SMS メッセージで受信した確認コードをアプリに入力したら、確認コードと確認 ID から Credential オブジェクトを作成し、そのオブジェクトを FirebaseAuth.SignInWithCredential に渡し、ユーザーをログインさせます。

  1. ユーザーから確認コードを取得します。
  2. 確認コードと確認 ID から Credential オブジェクトを作成します。
    Credential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. Credential オブジェクトを使用して、ユーザーをログインします。
    auth.SignInWithCredentialAsync(credential).ContinueWith(task =&gt {
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });
    

次のステップ

ユーザーが初めてログインすると、新しいユーザー アカウントが作成され、ユーザーがログインに使用した認証情報(ユーザー名とパスワード、電話番号、または認証プロバイダ情報)にアカウントがリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するために使用できます。

  • アプリでは、Firebase.Auth.FirebaseUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // The user's Id, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server, if you
      // have one; use User.TokenAsync() instead.
      string uid = user.UserId;
    }
    
  • Firebase Realtime Database と Cloud Storage のセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を auth 変数から取得し、それを使用してどのデータをユーザーからアクセス可能にするかを制御できます。

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーが複数の認証プロバイダを使用してアプリにログインできるようになります。

ユーザーのログアウトを行うには SignOut() を呼び出します。

auth.SignOut();

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。