Cómo vincular varios proveedores de autenticación con una cuenta en iOS

Para permitir que los usuarios accedan a tu app con varios proveedores de autenticación, puedes vincular las credenciales de proveedores de autenticación con una cuenta de usuario existente. Los usuarios se pueden identificar por el mismo ID de usuario de Firebase, sin importar el proveedor de autenticación que hayan usado para acceder. Por ejemplo, un usuario que accedió con una contraseña puede vincular una cuenta de Google y después usar cualquiera de los dos métodos para acceder. Por otra parte, un usuario anónimo puede vincular una cuenta de Facebook y luego acceder con Facebook para continuar usando tu app.

Antes de comenzar

Agrega compatibilidad para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a tu app.

Vincula las credenciales del proveedor de autenticación con una cuenta de usuario

Para vincular las credenciales del proveedor de autenticación con una cuenta de usuario existente:

  1. El usuario debe acceder con cualquier proveedor o método de autenticación.
  2. Completa el flujo de acceso del proveedor de autenticación nuevo, pero solamente hasta el paso anterior a llamar a uno de los métodos FIRAuth.signInWith. Por ejemplo, obtén el token de ID de Google, el token de acceso de Facebook o el correo electrónico y la contraseña del usuario.
  3. Obtén una FIRAuthCredential para el proveedor de autenticación nuevo:

    Acceso con Google
    Swift
    guard let authentication = user.authentication else { return }
    let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                      accessToken: authentication.accessToken)
    
    Objective-C
    GIDAuthentication *authentication = user.authentication;
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                     accessToken:authentication.accessToken];
    
    Acceso con Facebook
    Swift
    let credential = FacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
    
    Objective-C
    FIRAuthCredential *credential = [FIRFacebookAuthProvider
        credentialWithAccessToken:[FBSDKAccessToken currentAccessToken].tokenString];
    
    Acceso con correo electrónico y contraseña
    Swift
    let credential = EmailAuthProvider.credential(withEmail: email, password: password)
    
    Objective-C
    FIRAuthCredential *credential =
        [FIREmailAuthProvider credentialWithEmail:email
                                                 password:password];
    
  4. Pasa el objeto FIRAuthCredential al método linkWithCredential:completion: del usuario que accedió:

    Swift
        user.linkAndRetrieveData(with: credential) { (authResult, error) in
      // ...
    }
    }
    
    Objective-C
        [[FIRAuth auth].currentUser linkAndRetrieveDataWithCredential:credential
        completion:^(FIRAuthDataResult *result, NSError *_Nullable error) {
      // ...
    }];
    

    La llamada a linkWithCredential:completion: fallará si las credenciales ya se vincularon con la cuenta de otro usuario. En esta situación, debes administrar la fusión de las cuentas y los datos asociados según corresponda para tu app:

    Swift

    let prevUser = Auth.auth().currentUser
    Auth.auth().signInAndRetrieveData(with: credential) { (authResult, error) in
      if let error = error {
        // ...
        return
      }
      // User is signed in
      // ...
    }
                // Merge prevUser and currentUser accounts and data
                // ...
            }
    

    Objective-C

    FIRUser *prevUser = [FIRAuth auth].currentUser;
    [[FIRAuth auth] signInAndRetrieveDataWithCredential:credential
                                             completion:^(FIRAuthDataResult * _Nullable authResult,
                                                          NSError * _Nullable error) {
      if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      // ...
    }];
                                        // Merge prevUser and currentUser accounts and data
                                        // ...
                                    }];
    

Si la llamada a linkWithCredential:completion: se hace correctamente, el usuario podrá acceder con cualquier proveedor de autenticación vinculado y ver los mismos datos en Firebase.

Desvincula un proveedor de autenticación de una cuenta de usuario

Puedes desvincular un proveedor de autenticación de una cuenta, de forma que el usuario ya no pueda acceder con ese proveedor.

Para desvincular un proveedor de autenticación de una cuenta de usuario, pasa el ID del proveedor al método unlinkFromProvider:completion:. Puedes obtener los ID de los proveedores de autenticación vinculados a un usuario desde la propiedad providerData.

Swift

Auth.auth().currentUser?.unlink(fromProvider: providerID!) { (user, error) in
  // ...
}

Objective-C

[[FIRAuth auth].currentUser unlinkFromProvider:providerID
                                    completion:^(FIRUser *_Nullable user, NSError *_Nullable error) {
  // ...
}];

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.