Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Autenticarse con Firebase usando un número de teléfono y C++

Puede usar Firebase Authentication para iniciar sesión en un usuario mediante el envío de un mensaje SMS al teléfono del usuario. El usuario inicia sesión con un código de un solo uso contenido en el mensaje SMS.

Este documento describe cómo implementar un flujo de inicio de sesión de número de teléfono mediante el SDK de Firebase.

Antes de que empieces

  1. Agregue Firebase a su proyecto de C++ .
  2. Si aún no ha conectado su aplicación a su proyecto de Firebase, hágalo desde la consola de Firebase .

En las plataformas de Apple, tenga en cuenta que el inicio de sesión con el número de teléfono requiere un dispositivo físico y no funcionará en un simulador.

Preocupaciones de seguridad

La autenticación usando solo un número de teléfono, si bien es conveniente, es menos segura que los otros métodos disponibles, porque la posesión de un número de teléfono se puede transferir fácilmente entre usuarios. Además, en dispositivos con múltiples perfiles de usuario, cualquier usuario que pueda recibir mensajes SMS puede iniciar sesión en una cuenta usando el número de teléfono del dispositivo.

Si usa el inicio de sesión basado en el número de teléfono en su aplicación, debe ofrecerlo junto con métodos de inicio de sesión más seguros e informar a los usuarios sobre las ventajas y desventajas de seguridad del uso del inicio de sesión con el número de teléfono.

Habilite el inicio de sesión con número de teléfono para su proyecto de Firebase

Para que los usuarios inicien sesión por SMS, primero debe habilitar el método de inicio de sesión con número de teléfono para su proyecto de Firebase:

  1. En Firebase console , abra la sección Autenticación .
  2. En la página Método de inicio de sesión , habilite el método de inicio de sesión Número de teléfono .

La cuota de solicitud de inicio de sesión del número de teléfono de Firebase es lo suficientemente alta como para que la mayoría de las aplicaciones no se vean afectadas. Sin embargo, si necesita iniciar sesión en un volumen muy alto de usuarios con autenticación telefónica, es posible que deba actualizar su plan de precios. Consulte la página de precios .

Empezar a recibir notificaciones APNs (plataformas Apple)

Para usar la autenticación de número de teléfono en las plataformas de Apple, su aplicación debe poder recibir notificaciones de APN de Firebase. Cuando inicia sesión con un usuario con su número de teléfono por primera vez en un dispositivo, Firebase Authentication envía una notificación push silenciosa al dispositivo para verificar que la solicitud de inicio de sesión con el número de teléfono proviene de su aplicación. (Por este motivo, el inicio de sesión con número de teléfono no se puede utilizar en un simulador).

Para habilitar las notificaciones de APN para su uso con Firebase Authentication:

  1. En Xcode, habilite las notificaciones push para su proyecto.
  2. Sube tu certificado APNs a Firebase. Si aún no tiene un certificado APN, asegúrese de crear uno en el Centro de miembros para desarrolladores de Apple .

    1. Dentro de su proyecto en la consola Firebase, seleccione el ícono de ajustes, seleccione Configuración del proyecto y luego seleccione la pestaña Cloud Messaging .

    2. Seleccione el botón Cargar certificado para su certificado de desarrollo, su certificado de producción o ambos. Se requiere al menos uno.

    3. Para cada certificado, seleccione el archivo .p12 y proporcione la contraseña, si corresponde. Asegúrese de que el ID del paquete de este certificado coincida con el ID del paquete de su aplicación. Seleccione Guardar .

Enviar un código de verificación al teléfono del usuario

Para iniciar el inicio de sesión con el número de teléfono, presente al usuario una interfaz que le solicite que proporcione su número de teléfono y luego llame a PhoneAuthProvider::VerifyPhoneNumber para solicitar que Firebase envíe un código de autenticación al teléfono del usuario por SMS:

  1. Obtener el número de teléfono del usuario.

    Los requisitos legales varían, pero como práctica recomendada y para establecer expectativas para sus usuarios, debe informarles que si usan el inicio de sesión por teléfono, pueden recibir un mensaje SMS para verificación y se aplican tarifas estándar.

  2. Llame PhoneAuthProvider::VerifyPhoneNumber , pasándole el número de teléfono del usuario.
    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);
    
    Cuando llama a PhoneAuthProvider::VerifyPhoneNumber , Firebase,
    • (en iOS) envía una notificación push silenciosa a su aplicación,
    • envía un mensaje SMS que contiene un código de autenticación al número de teléfono especificado y pasa una identificación de verificación a su función de finalización. Necesitará tanto el código de verificación como el ID de verificación para iniciar sesión como usuario.
  3. Guarde el ID de verificación y restáurelo cuando se cargue su aplicación. Al hacerlo, puede asegurarse de que todavía tiene una identificación de verificación válida si su aplicación finaliza antes de que el usuario complete el flujo de inicio de sesión (por ejemplo, mientras cambia a la aplicación de SMS).

    Puede conservar el ID de verificación de la forma que desee. Si está escribiendo con un marco C++ multiplataforma, debería proporcionar notificaciones para la finalización y restauración de la aplicación. En estos eventos, puede guardar y restaurar, respectivamente, la identificación de verificación.

Si la llamada a VerifyPhoneNumber hace que se llame a OnCodeSent en su oyente, puede solicitar al usuario que escriba el código de verificación cuando lo reciba en el mensaje SMS.

Por otro lado, si la llamada a VerifyPhoneNumber da como resultado OnVerificationCompleted , entonces la verificación automática ha tenido éxito y ahora tendrá una Credential con la que puede usar como se describe a continuación.

Iniciar sesión del usuario con el código de verificación

Después de que el usuario proporcione a su aplicación el código de verificación del mensaje SMS, inicie sesión creando un objeto Credential a partir del código de verificación y el ID de verificación y transfiriendo ese objeto a Auth::SignInWithCredential .

  1. Obtenga el código de verificación del usuario.
  2. Cree un objeto Credential a partir del código de verificación y el ID de verificación.
    Credential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Inicie sesión en el usuario con el objeto 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);
    

Próximos pasos

Después de que un usuario inicia sesión por primera vez, se crea una nueva cuenta de usuario y se vincula a las credenciales (es decir, el nombre de usuario y la contraseña, el número de teléfono o la información del proveedor de autenticación) con las que el usuario inició sesión. Esta nueva cuenta se almacena como parte de su proyecto de Firebase y se puede usar para identificar a un usuario en cada aplicación de su proyecto, independientemente de cómo inicie sesión el usuario.

  • En sus aplicaciones, puede obtener la información básica del perfil del usuario del objeto 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();
    }
    
  • En sus Reglas de seguridad de Firebase Realtime Database y Cloud Storage, puede obtener el ID de usuario único del usuario que inició sesión de la variable auth y usarlo para controlar a qué datos puede acceder un usuario.

Puede permitir que los usuarios inicien sesión en su aplicación utilizando varios proveedores de autenticación vinculando las credenciales del proveedor de autenticación a una cuenta de usuario existente.

Para cerrar la sesión de un usuario, llame a SignOut() :

auth->SignOut();