Autenticar mediante el inicio de sesión de Google en plataformas Apple

Puedes permitir que tus usuarios se autentiquen con Firebase utilizando sus cuentas de Google integrando el inicio de sesión de Google en tu aplicación.

Antes de que empieces

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.

Agregue el SDK de inicio de sesión de Google a su proyecto

  1. En Xcode, con el proyecto de su aplicación abierto, navegue hasta Archivo > Agregar paquetes .

  2. Cuando se le solicite, agregue el repositorio del SDK de inicio de sesión de Google:

    https://github.com/google/GoogleSignIn-iOS
    
  3. Cuando termine, Xcode comenzará automáticamente a resolver y descargar sus dependencias en segundo plano.

Habilite el inicio de sesión de Google para su proyecto de Firebase

Para permitir que los usuarios inicien sesión con Google Sign-In, primero debes habilitar el proveedor de Google Sign-In para tu proyecto de Firebase:

  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 Google .
  3. Clic en Guardar .

  4. Descargue una nueva copia del archivo GoogleService-Info.plist de su proyecto y cópielo en su proyecto Xcode. Sobrescriba cualquier versión existente con la nueva. (Consulta Agregar Firebase a tu proyecto de iOS ).

Importe los archivos de encabezado necesarios

Primero, debes importar los archivos de encabezado del SDK de Firebase y del SDK de inicio de sesión de Google a tu aplicación.

Rápido

import FirebaseCore
import FirebaseAuth
import GoogleSignIn

C objetivo

@import FirebaseCore;
@import GoogleSignIn;

Implementar el inicio de sesión de Google

Implemente el inicio de sesión de Google siguiendo estos pasos. Consulte la documentación para desarrolladores de Inicio de sesión de Google para obtener detalles sobre el uso de Inicio de sesión de Google con iOS.

  1. Agregue esquemas de URL personalizados a su proyecto Xcode:
    1. Abra la configuración de su proyecto: haga 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 un esquema de URL para su ID de cliente invertido. Para encontrar este valor, abra el archivo de configuración GoogleService-Info.plist y busque la clave REVERSED_CLIENT_ID . Copie el valor de esa clave y péguelo en el cuadro Esquemas de URL en la página de configuración. Deje los demás campos intactos.

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

  2. En el application:didFinishLaunchingWithOptions: del delegado de su aplicación, configure el objeto FirebaseApp .

    Rápido

    FirebaseApp.configure()
    

    C objetivo

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. Implemente el application:openURL:options: del delegado de su aplicación. El método debe llamar al método handleURL de la instancia GIDSignIn , que manejará adecuadamente la URL que recibe su aplicación al final del proceso de autenticación.

    Rápido

    func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }
    

    C objetivo

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
    
  4. Pase el controlador de vista de presentación y el ID de cliente de su aplicación al método signIn del proveedor de inicio de sesión de Google y cree una credencial de autenticación de Firebase a partir del token de autenticación de Google resultante:

    Rápido

    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    
    // Create Google Sign In configuration object.
    let config = GIDConfiguration(clientID: clientID)
    GIDSignIn.sharedInstance.configuration = config
    
    // Start the sign in flow!
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { [unowned self] result, error in
      guard error == nil else {
        // ...
      }
    
      guard let user = result?.user,
        let idToken = user.idToken?.tokenString
      else {
        // ...
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: user.accessToken.tokenString)
    
      // ...
    }
    

    C objetivo

    GIDConfiguration *config = [[GIDConfiguration alloc] initWithClientID:[FIRApp defaultApp].options.clientID];
    [GIDSignIn.sharedInstance setConfiguration:config];
    
    __weak __auto_type weakSelf = self;
    [GIDSignIn.sharedInstance signInWithPresentingViewController:self
          completion:^(GIDSignInResult * _Nullable result, NSError * _Nullable error) {
      __auto_type strongSelf = weakSelf;
      if (strongSelf == nil) { return; }
    
      if (error == nil) {
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString
                                         accessToken:result.user.accessToken.tokenString];
        // ...
      } else {
        // ...
      }
    }];
    
    
  5. Agregue un GIDSignInButton a su guión gráfico, archivo XIB o cree una instancia mediante programación. Para agregar el botón a su guión gráfico o archivo XIB, agregue una Vista y configure su clase personalizada en GIDSignInButton .
  6. Opcional : si desea personalizar el botón, haga lo siguiente:

    Rápido

    1. En su controlador de vista, declare el botón de inicio de sesión como una propiedad.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. Conecte el botón a la propiedad signInButton que acaba de declarar.
    3. Personalice el botón configurando las propiedades del objeto GIDSignInButton .

    C objetivo

    1. En el archivo de encabezado de su controlador de vista, declare el botón de inicio de sesión como una propiedad.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. Conecte el botón a la propiedad signInButton que acaba de declarar.
    3. Personalice el botón configurando las propiedades del objeto GIDSignInButton .

Autenticar con Firebase

Finalmente, complete el proceso de inicio de sesión de Firebase con la credencial de autenticación creada en el paso anterior.

Rápido

Auth.auth().signIn(with: credential) { result, error in

  // At this point, our 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;
  // ...
}];

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 .