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

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

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

始める前に

  1. Firebase Authentication を使用するには、Firebase Unity SDK(具体的には FirebaseAuth.unitypackage)を Unity プロジェクトに追加する必要があります。

    これらの初期設定のステップの詳しい手順については、Firebase を Unity プロジェクトに追加するをご覧ください。

  2. アプリを Firebase プロジェクトに接続していない場合は、Firebase コンソールで接続します。
  3. 次に示す、電話番号ログインのプラットフォーム要件を把握します。
    • 電話番号ログインはモバイル プラットフォームでのみ使用できる。
    • iOS で電話番号ログインを行うには実機が必要で、シミュレータでは機能しない。

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

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

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

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

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

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

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

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

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

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

  1. Xcode で、プロジェクトのプッシュ通知を有効にします
  2. APNs 証明書を Firebase にアップロードします。まだ APNs 証明書を用意していない場合は、Apple Developer Member Center で作成してください。

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

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

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

ユーザーの電話に確認コードを送信する

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

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

    法的要件はさまざまに異なりますが、電話番号ログインを使用する場合は確認用の SMS メッセージが送られる旨、それには標準料金がかかる旨をユーザーにあらかじめ知らせることをおすすめします。

  2. PhoneAuthProvider.VerifyPhoneNumber を呼び出し、ユーザーの電話番号を含む PhoneAuthOptions を渡します。
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) => {
        // 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) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // 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) => {
        // 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 のコールバックが呼び出された場合は自動検証が成功しており、PhoneAuthCredential が取得されます(使用方法は後で説明します)。

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

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

  1. ユーザーから確認コードを取得します。
  2. 確認コードと確認 ID から Credential オブジェクトを作成します。
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. PhoneAuthCredential オブジェクトを使用して、ユーザーをログインさせます。
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      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();