Habilitar la autenticación entre aplicaciones con Apple Keychain compartido

Para compartir estados de autenticación entre múltiples aplicaciones o extensiones en plataformas Apple, almacene el estado de autenticación en un llavero compartido usando Servicios de Llavero y configure sus aplicaciones para usar el llavero compartido.

Esto permite a los usuarios:

  • Inicie sesión una vez y acceda a todas las aplicaciones que pertenecen al mismo grupo de acceso.
  • Cierre sesión una vez y cierre sesión en todas las aplicaciones que pertenecen al mismo grupo de acceso.

Compartir el estado de autenticación entre aplicaciones

Para compartir el estado de autenticación entre aplicaciones:

  1. Configure un grupo de acceso para sus aplicaciones.

    Puede utilizar un grupo de acceso a llaveros o un grupo de aplicaciones. Consulte Compartir acceso a elementos de llavero entre una colección de aplicaciones para obtener más detalles.

    Para configurar un grupo de acceso a llaveros, haga lo siguiente para cada aplicación:

    1. En Xcode, vaya a Configuración del proyecto > Capacidades .
    2. Habilite el uso compartido de llaveros.
    3. Agregue un identificador de grupo de llaveros. Utilice el mismo identificador para todas las aplicaciones que desee compartir.
  2. En cada aplicación, configure el grupo de acceso al grupo de acceso al llavero o al grupo de aplicaciones que creó en el paso anterior.

    Rápido

    do {
      try Auth.auth().useUserAccessGroup("TEAMID.com.example.group1")
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    

    C objetivo

    [FIRAuth.auth useUserAccessGroup:@"TEAMID.com.example.group1"
                                       error:nil];
    
  3. En al menos una aplicación, inicie sesión como usuario con cualquier método de inicio de sesión.

    Rápido

    Auth.auth().signInAnonymously { result, error in
      // User signed in
    }
    

    C objetivo

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

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

    Rápido

    var user = Auth.auth().currentUser
    

    C objetivo

    FIRUser *user = FIRAuth.auth.currentUser;
    

Volver a un llavero no compartido

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

    Rápido

    do {
      try Auth.auth().useUserAccessGroup(nil)
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    

    C objetivo

    [FIRAuth.auth useUserAccessGroup:nil error:nil];
    
  2. Inicie sesión como usuario con cualquier método de inicio de sesión. El estado de usuario no estará disponible para ninguna otra aplicación.

    Rápido

    Auth.auth().signInAnonymously { result, error in
      // User signed in
    }
    

    C objetivo

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

Migrar un usuario que ha iniciado sesión a un llavero compartido

Para migrar un usuario que ya inició sesión a un estado compartido:

  1. Haga una referencia al usuario actual para uso futuro.

    Rápido

    var user = Auth.auth().currentUser
    

    C objetivo

    FIRUser *user = FIRAuth.auth.currentUser;
    
  2. (Opcional) Verifique el estado de autenticación del grupo de acceso que desea compartir.

    Rápido

    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
    }
    

    C objetivo

    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. Utilice un grupo de acceso que configuró previamente en la configuración del proyecto.

    Rápido

    do {
      try Auth.auth().useUserAccessGroup(accessGroup)
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    

    C objetivo

    [FIRAuth.auth useUserAccessGroup:accessGroup error:nil];
    
  4. Actualiza el usuario actual.

    Rápido

    Auth.auth().updateCurrentUser(user!) { error in
      // Error handling
    }
    

    C objetivo

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