Autenticarse con Firebase en plataformas Apple usando un número de teléfono

Puede utilizar Firebase Authentication para iniciar sesión en un usuario enviando un mensaje SMS al teléfono del usuario. El usuario inicia sesión utilizando un código de un solo uso contenido en el mensaje SMS.

La forma más sencilla de agregar el inicio de sesión con un número de teléfono a su aplicación es usar FirebaseUI, que incluye un widget de inicio de sesión directo que implementa flujos de inicio de sesión para el inicio de sesión con un número de teléfono, así como un inicio de sesión federado y basado en contraseña. -en. Este documento describe cómo implementar un flujo de inicio de sesión con un número de teléfono mediante el SDK de Firebase.

Antes de que empieces

  1. Si aún no has conectado tu aplicación a tu proyecto de Firebase, hazlo desde Firebase console .
  2. Utilice Swift Package Manager para instalar y administrar las dependencias de Firebase.

    1. En Xcode, con el proyecto de su aplicación abierto, navegue hasta Archivo > Agregar paquetes .
    2. Cuando se le solicite, agregue el repositorio SDK de las plataformas Firebase Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Elija la biblioteca de autenticación de Firebase.
    5. Agregue el indicador -ObjC a la sección Otros indicadores del vinculador de la configuración de compilación de su objetivo.
    6. Cuando termine, Xcode comenzará automáticamente a resolver y descargar sus dependencias en segundo plano.

Preocupaciones de seguridad

La autenticación utilizando sólo un número de teléfono, si bien es conveniente, es menos segura que otros métodos disponibles, porque la posesión de un número de teléfono puede transferirse 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 utilizando el número de teléfono del dispositivo.

Si utiliza el inicio de sesión basado en un 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 que implica el uso del inicio de sesión por número de teléfono.

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

Para iniciar sesión de usuarios mediante SMS, primero debes habilitar el método de inicio de sesión con número de teléfono para tu proyecto de Firebase:

  1. En Firebase console , abre 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 por número de teléfono .

La cuota de solicitudes de inicio de sesión de números 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 grande de usuarios con autenticación telefónica, es posible que deba actualizar su plan de precios. Vea la página de precios .

Habilitar la verificación de aplicaciones

Para utilizar la autenticación de número de teléfono, Firebase debe poder verificar que las solicitudes de inicio de sesión de número de teléfono provienen de su aplicación. Hay dos formas en que Firebase Authentication logra esto:

  • Notificaciones silenciosas de APN : cuando inicia sesión un usuario con su número de teléfono por primera vez en un dispositivo, Firebase Authentication envía un token al dispositivo mediante una notificación push silenciosa. Si su aplicación recibe correctamente la notificación de Firebase, puede continuar con el inicio de sesión con el número de teléfono.

    Para iOS 8.0 y versiones posteriores, las notificaciones silenciosas no requieren el consentimiento explícito del usuario y, por lo tanto, no se ven afectadas si un usuario rechaza recibir notificaciones de APN en la aplicación. Por lo tanto, la aplicación no necesita solicitar permiso del usuario para recibir notificaciones automáticas al implementar la autenticación del número de teléfono de Firebase.

  • Verificación reCAPTCHA : en caso de que no sea posible enviar o recibir una notificación push silenciosa, como cuando el usuario ha desactivado la actualización en segundo plano para su aplicación o cuando prueba su aplicación en un simulador de iOS, Firebase Authentication utiliza la verificación reCAPTCHA para completar el teléfono. flujo de inicio de sesión. El desafío reCAPTCHA a menudo se puede completar sin que el usuario tenga que resolver nada.

Cuando las notificaciones push silenciosas están configuradas correctamente, solo un porcentaje muy pequeño de usuarios experimentará el flujo reCAPTCHA. No obstante, debe asegurarse de que el inicio de sesión del número de teléfono funcione correctamente, ya sea que haya notificaciones automáticas silenciosas disponibles o no.

Comience a recibir notificaciones silenciosas

Para habilitar las notificaciones de APN para usar con Firebase Authentication:

  1. En Xcode, habilite las notificaciones push para su proyecto.
  2. Cargue su clave de autenticación de APN en Firebase. Si aún no tiene una clave de autenticación de APN, asegúrese de crear una en el Centro de miembros desarrolladores de Apple .

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

    2. En la clave de autenticación de APN en la configuración de la aplicación iOS , haga clic en el botón Cargar .

    3. Busque la ubicación donde guardó su clave, selecciónela y haga clic en Abrir . Agregue el ID de la clave (disponible en el Centro de miembros desarrolladores de Apple ) y haga clic en Cargar .

    Si ya tiene un certificado APN, puede cargar el certificado en su lugar.

Configurar la verificación reCAPTCHA

Para permitir que el SDK de Firebase utilice la verificación reCAPTCHA:

  1. Agregue esquemas de URL personalizados a su proyecto Xcode:
    1. Abra la configuración de su proyecto: haga doble clic en el nombre del proyecto en la vista de árbol de la izquierda. Seleccione su aplicación en la sección OBJETIVOS , luego seleccione la pestaña Información y expanda la sección Tipos de URL .
    2. Haga clic en el botón + y agregue su ID de aplicación codificada como un esquema de URL. Puede encontrar su ID de aplicación codificada en la página Configuración general de Firebase console, en la sección de su aplicación iOS. Deje los demás campos en blanco.

      Cuando esté completa, su configuración debería verse similar a la siguiente (pero con los valores específicos de su aplicación):

      Captura de pantalla de la interfaz de configuración del esquema de URL personalizado de Xcode
  2. Opcional : si desea personalizar la forma en que su aplicación presenta SFSafariViewController cuando muestra reCAPTCHA al usuario, cree una clase personalizada que se ajuste al protocolo AuthUIDelegate y pásela a verifyPhoneNumber(_:uiDelegate:completion:) .

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 verifyPhoneNumber(_:uiDelegate:completion:) para solicitar que Firebase envíe un código de autenticación al teléfono del usuario por SMS:

  1. Obtenga 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 utilizan el inicio de sesión por teléfono, es posible que reciban un mensaje SMS para verificación y se apliquen tarifas estándar.

  2. Llame a verifyPhoneNumber(_:uiDelegate:completion:) , pasándole el número de teléfono del usuario.

    Rápido

    PhoneAuthProvider.provider()
      .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
          if let error = error {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // Sign in using the verificationID and the code sent to the user
          // ...
      }

    C objetivo

    [[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
      if (error) {
        [self showMessagePrompt:error.localizedDescription];
        return;
      }
      // Sign in using the verificationID and the code sent to the user
      // ...
    }];

    El método verifyPhoneNumber es reentrante: si lo llama varias veces, como en el método onAppear de una vista, el método verifyPhoneNumber no enviará un segundo SMS a menos que se haya agotado el tiempo de espera de la solicitud original.

    Cuando llamas verifyPhoneNumber(_:uiDelegate:completion:) , Firebase envía una notificación push silenciosa a tu aplicación o emite un desafío reCAPTCHA al usuario. Después de que su aplicación recibe la notificación o el usuario completa el desafío reCAPTCHA, Firebase 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.

    El mensaje SMS enviado por Firebase también se puede localizar especificando el idioma de autenticación a través de la propiedad languageCode en su instancia de autenticación.

    Rápido

     // Change language code to french.
     Auth.auth().languageCode = "fr";
    

    C objetivo

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. Guarde la ID de verificación y restáurela cuando se cargue su aplicación. Al hacerlo, puede asegurarse de tener 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, al cambiar a la aplicación de SMS).

    Puede conservar el ID de verificación de la forma que desee. Una forma sencilla es guardar el ID de verificación con el objeto NSUserDefaults :

    Rápido

    UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
    

    C objetivo

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:verificationID forKey:@"authVerificationID"];
    

    Luego, puede restaurar el valor guardado:

    Rápido

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    

    C objetivo

    NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
    

Si la llamada para verifyPhoneNumber(_:uiDelegate:completion:) tiene éxito, puede pedirle al usuario que escriba el código de verificación cuando lo reciba en el mensaje SMS.

Inicia sesión como 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 FIRPhoneAuthCredential a partir del código de verificación y el ID de verificación y pasando ese objeto a signInWithCredential:completion: .

  1. Obtenga el código de verificación del usuario.
  2. Cree un objeto FIRPhoneAuthCredential a partir del código de verificación y el ID de verificación.

    Rápido

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

    C objetivo

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. Inicie sesión como usuario con el objeto FIRPhoneAuthCredential :

    Rápido

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }

    C objetivo

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];

Prueba con números de teléfono ficticios

Puedes configurar números de teléfono ficticios para el desarrollo a través de Firebase console. Las pruebas con números de teléfono ficticios brindan estos beneficios:

  • Pruebe la autenticación del número de teléfono sin consumir su cuota de uso.
  • Pruebe la autenticación del número de teléfono sin enviar un mensaje SMS real.
  • Realiza pruebas consecutivas con el mismo número de teléfono sin que te limiten. Esto minimiza el riesgo de rechazo durante el proceso de revisión de la tienda de aplicaciones si el revisor utiliza el mismo número de teléfono para la prueba.
  • Pruebe fácilmente en entornos de desarrollo sin ningún esfuerzo adicional, como la capacidad de desarrollar en un simulador de iOS o un emulador de Android sin los servicios de Google Play.
  • Escriba pruebas de integración sin verse bloqueado por controles de seguridad que normalmente se aplican a números de teléfono reales en un entorno de producción.

Los números de teléfono ficticios deben cumplir estos requisitos:

  1. Asegúrese de utilizar números de teléfono que sean realmente ficticios y que no existan ya. Firebase Authentication no le permite configurar números de teléfono existentes utilizados por usuarios reales como números de prueba. Una opción es utilizar números con prefijo 555 como números de teléfono de prueba de EE. UU., por ejemplo: +1 650-555-3434
  2. Los números de teléfono deben tener el formato correcto según la longitud y otras restricciones. Seguirán pasando por la misma validación que el número de teléfono de un usuario real.
  3. Puede agregar hasta 10 números de teléfono para el desarrollo.
  4. Utilice números/códigos de teléfono de prueba que sean difíciles de adivinar y cámbielos con frecuencia.

Crea números de teléfono ficticios y códigos de verificación.

  1. En Firebase console , abre la sección Autenticación .
  2. En la pestaña Método de inicio de sesión , habilite el Proveedor de teléfono si aún no lo ha hecho.
  3. Abra el menú Números de teléfono para probar el acordeón.
  4. Proporcione el número de teléfono que desea probar, por ejemplo: +1 650-555-3434 .
  5. Proporcione el código de verificación de 6 dígitos para ese número específico, por ejemplo: 654321 .
  6. Añade el número. Si es necesario, puedes eliminar el número de teléfono y su código colocando el cursor sobre la fila correspondiente y haciendo clic en el icono de la papelera.

Prueba manual

Puede comenzar a usar directamente un número de teléfono ficticio en su aplicación. Esto le permite realizar pruebas manuales durante las etapas de desarrollo sin tener problemas de cuotas ni limitaciones. También puedes realizar la prueba directamente desde un simulador de iOS o un emulador de Android sin tener instalados los servicios de Google Play.

Cuando proporciona el número de teléfono ficticio y envía el código de verificación, no se envía ningún SMS real. En su lugar, debe proporcionar el código de verificación configurado previamente para completar el inicio de sesión.

Al finalizar el inicio de sesión, se crea un usuario de Firebase con ese número de teléfono. El usuario tiene el mismo comportamiento y propiedades que un usuario de número de teléfono real y puede acceder a Realtime Database/Cloud Firestore y otros servicios de la misma manera. El token de identificación acuñado durante este proceso tiene la misma firma que un usuario de número de teléfono real.

Otra opción es establecer un rol de prueba mediante reclamos personalizados para estos usuarios para diferenciarlos como usuarios falsos si desea restringir aún más el acceso.

Pruebas de integración

Además de las pruebas manuales, Firebase Authentication proporciona API para ayudar a escribir pruebas de integración para las pruebas de autenticación telefónica. Estas API desactivan la verificación de aplicaciones al desactivar el requisito de reCAPTCHA en la web y las notificaciones push silenciosas en iOS. Esto hace que las pruebas de automatización sean posibles en estos flujos y más fáciles de implementar. Además, ayudan a brindar la capacidad de probar flujos de verificación instantánea en Android.

En iOS, la configuración appVerificationDisabledForTesting debe establecerse en TRUE antes de llamar verifyPhoneNumber . Esto se procesa sin requerir ningún token APN ni enviar notificaciones automáticas silenciosas en segundo plano, lo que facilita la prueba en un simulador. Esto también deshabilita el flujo de reserva de reCAPTCHA.

Tenga en cuenta que cuando la verificación de la aplicación está deshabilitada, el uso de un número de teléfono no ficticio no permitirá completar el inicio de sesión. Solo se pueden usar números de teléfono ficticios con esta API.

Rápido

let phoneNumber = "+16505554567"

// This test verification code is specified for the given test phone number in the developer console.
let testVerificationCode = "123456"

Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
                                                            verificationID, error in
    if (error) {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signInAndRetrieveData(with: credential) { authData, error in
      if (error) {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authData.user
    }];
}];

C objetivo

NSString *phoneNumber = @"+16505554567";

// This test verification code is specified for the given test phone number in the developer console.
NSString *testVerificationCode = @"123456";

[FIRAuth auth].settings.appVerificationDisabledForTesting = YES;
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber
                                        completion:^(NSString *_Nullable verificationID,
                                                     NSError *_Nullable error) {
    if (error) {
      // Handles error
      [self handleError:error];
      return;
    }
    FIRAuthCredential *credential =
        [FIRPhoneAuthProvider credentialWithVerificationID:verificationID
                                          verificationCode:testVerificationCode];
    [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential
                                                completion:^(FIRUser *_Nullable user,
                                                             NSError *_Nullable error) {
      if (error) {
        // Handles error
        [self handleError:error];
        return;
      }
      _user = user;
    }];
}];

Apéndice: Uso del inicio de sesión telefónico sin necesidad de hacer swizzling

Firebase Authentication utiliza el método swizzling para obtener automáticamente el token APN de su aplicación, para manejar las notificaciones automáticas silenciosas que Firebase envía a su aplicación y para interceptar automáticamente el redireccionamiento del esquema personalizado desde la página de verificación reCAPTCHA durante la verificación.

Si prefiere no utilizar swizzling, puede desactivarlo agregando el indicador FirebaseAppDelegateProxyEnabled al archivo Info.plist de su aplicación y configurándolo en NO . Tenga en cuenta que establecer este indicador en NO también desactiva el swizzling para otros productos de Firebase, incluido Firebase Cloud Messaging.

Si desactivas el swizzling, debes pasar explícitamente el token del dispositivo APN, las notificaciones automáticas y la URL de redireccionamiento del esquema personalizado a Firebase Authentication.

Si está creando una aplicación SwiftUI, también debe pasar explícitamente el token del dispositivo APN, las notificaciones automáticas y la URL de redireccionamiento del esquema personalizado a Firebase Authentication.

Para obtener el token del dispositivo APN, implemente el método application(_:didRegisterForRemoteNotificationsWithDeviceToken:) y, en él, pase el token del dispositivo al método setAPNSToken(_:type:) de Auth .

Rápido

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // Pass device token to auth
  Auth.auth().setAPNSToken(deviceToken, type: .prod)

  // Further handling of the device token if needed by the app
  // ...
}

C objetivo

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // Pass device token to auth.
  [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd];
  // Further handling of the device token if needed by the app.
}

Para manejar las notificaciones push, en el application(_:didReceiveRemoteNotification:fetchCompletionHandler:): verifique las notificaciones relacionadas con la autenticación de Firebase llamando al método canHandleNotification(_:) de Auth .

Rápido

func application(_ application: UIApplication,
    didReceiveRemoteNotification notification: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  if Auth.auth().canHandleNotification(notification) {
    completionHandler(.noData)
    return
  }
  // This notification is not auth related; it should be handled separately.
}

C objetivo

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)notification
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Pass notification to auth and check if they can handle it.
  if ([[FIRAuth auth] canHandleNotification:notification]) {
    completionHandler(UIBackgroundFetchResultNoData);
    return;
  }
  // This notification is not auth related; it should be handled separately.
}

Para manejar la URL de redireccionamiento del esquema personalizado, implemente el método application(_:open:options:) y, en ellos, pase la URL al método canHandleURL(_:) de Auth .

Rápido

func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related; it should be handled separately.
}

C objetivo

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
}

Si está utilizando SwiftUI o UISceneDelegate , para manejar la URL de redireccionamiento, implemente el método scene(_:openURLContexts:) y, en ellos, pase la URL al método canHandleURL(_:) de Auth .

Rápido

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
  for urlContext in URLContexts {
      let url = urlContext.url
      Auth.auth().canHandle(url)
  }
  // URL not auth related; it should be handled separately.
}

C objetivo

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

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 desde el objeto User . Consulte Administrar usuarios .

  • En las reglas de seguridad de Firebase Realtime Database y Cloud Storage, puede obtener el ID de usuario único del usuario que inició sesión a partir 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 múltiples 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 signOut: .

Rápido

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

C objetivo

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Es posible que también desee agregar un código de manejo de errores para toda la gama de errores de autenticación. Consulte Manejar errores .