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

電話番号とC ++を使用してFirebaseで認証する

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

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

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

あなたが始める前に

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

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

セキュリティ上の懸念

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

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

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

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

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

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

APNs 通知の受信を開始する (Apple プラットフォーム)

Apple プラットフォームで電話番号認証を使用するには、アプリが 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を呼び出して、ユーザーの電話番号を渡します。
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(Credential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(phone_number, kAutoVerifyTimeOut, null,
                                      &phone_listener);
    
    PhoneAuthProvider::VerifyPhoneNumber 、Firebase、
    • (iOS の場合) アプリにサイレント プッシュ通知を送信します。
    • 指定された電話番号に認証コードを含む SMS メッセージを送信し、確認 ID を完了関数に渡します。ユーザーをサインインするには、確認コードと確認 ID の両方が必要です。
  3. 検証 ID を保存し、アプリの読み込み時に復元します。そうすることで、ユーザーがサインイン フローを完了する前にアプリが終了した場合 (たとえば、SMS アプリへの切り替え中) に、有効な確認 ID を引き続き保持することができます。

    検証 ID は任意の方法で永続化できます。クロスプラットフォームの C++ フレームワークで作成している場合は、アプリの終了と復元に関する通知を提供する必要があります。これらのイベントでは、検証 ID をそれぞれ保存および復元できます。

VerifyPhoneNumberを呼び出した結果、Listener でOnCodeSentが呼び出された場合、ユーザーが SMS メッセージで確認コードを受信したときに、確認コードを入力するように求めることができます。

一方、 OnVerificationCompletedの呼び出しがVerifyPhoneNumberになった場合は、自動検証が成功し、以下で説明するように使用できるCredentialが得られます。

確認コードを使用してユーザーにサインインします

ユーザーが SMS メッセージからアプリに確認コードを提供したら、確認コードと確認 ID からCredentialオブジェクトを作成し、そのオブジェクトをAuth::SignInWithCredentialに渡すことで、ユーザーをサインインさせます。

  1. ユーザーから確認コードを取得します。
  2. 検証コードと検証 ID からCredentialオブジェクトを作成します。
    Credential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Credentialオブジェクトを使用してユーザーにサインインします:
    Future<User*> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            const User* user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user->phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user->uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user->provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);
    

次のステップ

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

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

    firebase::auth::User* user = auth->current_user();
    if (user != nullptr) {
      std::string name = user->display_name();
      std::string email = user->email();
      std::string photo_url = user->photo_url();
      // 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 firebase::auth::User::Token() instead.
      std::string uid = user->uid();
    }
    
  • Firebase Realtime Database と Cloud Storageセキュリティ ルールでは、サインインしているユーザーの一意のユーザー ID をauth変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。

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

ユーザーをサインアウトするには、 SignOut()を呼び出します。

auth->SignOut();