Habilita la autenticación entre apps con el llavero compartido de Apple

Para compartir los estados de autenticación entre varias apps o extensiones en plataformas de Apple, almacena el estado de autenticación en un llavero compartido con Keychain Services y configura tus apps para que lo usen.

Esta acción permite a los usuarios hacer lo siguiente:

  • Acceder una vez y mantener la sesión abierta en todas las apps que pertenezcan al mismo grupo de acceso
  • Salir una vez y mantener la sesión cerrada en todas las apps que pertenezcan al mismo grupo de acceso

Comparte el estado de autenticación entre apps

Sigue estos pasos para compartir el estado de autenticación entre apps:

  1. Configura un grupo de acceso para tus apps.

    Puedes usar un grupo de acceso con llavero o un grupo de apps. Para obtener detalles, consulta Comparte el acceso a elementos en llaveros entre un grupo de apps.

    Para configurar un grupo de acceso con llavero, haz lo siguiente en cada app:

    1. En Xcode, ve a Configuración del proyecto > Funciones.
    2. Habilita la opción “Uso compartido de llaveros”.
    3. Agrega un identificador de grupo de llaveros. Usa el mismo identificador para todas las apps que quieres que compartan el estado.
  2. En cada app, configura el grupo de acceso según el grupo de acceso con llavero o el grupo de apps que creaste en el paso anterior.

    do {
      try Auth.auth().useUserAccessGroup("TEAMID.com.example.group1")
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    
    [FIRAuth.auth useUserAccessGroup:@"TEAMID.com.example.group1"
                                       error:nil];
    
  3. Al menos en una app, haz que un usuario acceda con cualquier método de acceso.

    Auth.auth().signInAnonymously { result, error in
      // User signed in
    }
    
    [FIRAuth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *_Nullable result,
                                               NSError *_Nullable error) {
      // User signed in
    }];
    

    El mismo usuario actual está disponible en todas las apps del grupo de acceso.

    var user = Auth.auth().currentUser
    
    FIRUser *user = FIRAuth.auth.currentUser;
    

Cambia a un llavero no compartido

  1. Configura el grupo de acceso en nil para dejar de compartir el estado de autenticación.

    do {
      try Auth.auth().useUserAccessGroup(nil)
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    
    [FIRAuth.auth useUserAccessGroup:nil error:nil];
    
  2. Haz que un usuario acceda con cualquier método de acceso. El estado del usuario no estará disponible para ninguna otra app.

    Auth.auth().signInAnonymously { result, error in
      // User signed in
    }
    
    [FIRAuth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *_Nullable result,
                                       NSError *_Nullable error) {
      // User signed in
    }];
    

Migra un usuario activo a un llavero compartido

Sigue estos pasos para migrar un usuario activo a un estado compartido:

  1. Haz una referencia al usuario actual para usarla más adelante.

    var user = Auth.auth().currentUser
    
    FIRUser *user = FIRAuth.auth.currentUser;
    
  2. Verifica el estado de autenticación del grupo de acceso que quieres compartir (opcional).

    let accessGroup = "TEAMID.com.example.group1"
    var tempUser: User?
    do {
      try tempUser = Auth.auth().getStoredUser(forAccessGroup: accessGroup)
    } catch let error as NSError {
      print("Error getting stored user: %@", error)
    }
    if tempUser != nil {
      // A user exists in the access group
    } else {
      // No user exists in the access group
    }
    
    NSString *accessGroup = @"TEAMID.com.example.group1";
    FIRUser *tempUser = [FIRAuth getStoredUserForAccessGroup:accessGroup
                                                       error:nil];
    if (tempUser) {
      // A user exists in the access group
      } else {
      // No user exists in the access group
    }
    
  3. Usa un grupo de acceso que ya hayas establecido en la configuración del proyecto.

    do {
      try Auth.auth().useUserAccessGroup(accessGroup)
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    
    [FIRAuth.auth useUserAccessGroup:accessGroup error:nil];
    
  4. Actualiza al usuario actual.

    Auth.auth().updateCurrentUser(user!) { error in
      // Error handling
    }
    
    [FIRAuth.auth updateCurrentUser:user completion:^(NSError * _Nullable error) {
      // Error handling
    }];
    
  5. Ahora, otras apps que tienen acceso al mismo grupo de acceso pueden acceder al usuario.