Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

Unityの電話番号を使用してFirebaseで認証する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

SMS メッセージをユーザーの電話に送信することで、Firebase Authentication を使用してユーザーをサインインさせることができます。ユーザーは、SMS メッセージに含まれるワンタイム コードを使用してサインインします。

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

あなたが始める前に

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

    Unity プロジェクトに Firebase を追加するで、これらの初期設定手順の詳細な手順を確認してください。

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

iOS では、電話番号によるサインインには物理デバイスが必要であり、シミュレーターでは機能しないことに注意してください。

セキュリティ上の懸念

電話番号のみを使用した認証は便利ですが、電話番号の所有権がユーザー間で簡単に譲渡される可能性があるため、他の使用可能な方法よりも安全性が低くなります。また、複数のユーザー プロファイルを持つデバイスでは、SMS メッセージを受信できるユーザーは、デバイスの電話番号を使用してアカウントにサインインできます。

アプリで電話番号ベースのサインインを使用する場合は、より安全なサインイン方法と一緒に提供し、電話番号によるサインインの使用によるセキュリティのトレードオフについてユーザーに通知する必要があります。

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

ユーザーを SMS でサインインするには、最初に Firebase プロジェクトで電話番号によるサインイン方法を有効にする必要があります。

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

Firebase の電話番号サインイン リクエスト クォータは十分に高いため、ほとんどのアプリは影響を受けません。ただし、電話認証を使用して大量のユーザーをサインインさせる必要がある場合は、料金プランのアップグレードが必要になる場合があります。料金ページをご覧ください。

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

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

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

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

    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) => {
        // 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 は任意の方法で永続化できます。簡単な方法は、検証 ID をUnityEngine.PlayerPrefsで保存することです。

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 => {
      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();