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.

    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. En al menos una aplicación, inicie sesión como usuario con cualquier método de inicio de sesión.

    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 aplicaciones del grupo de acceso.

    var user = Auth.auth().currentUser
    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.

    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. 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.

    Auth.auth().signInAnonymously { result, error in
     
    // User signed in
    }
    [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.

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

    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. Utilice un grupo de acceso que configuró previamente 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 el usuario actual.

    Auth.auth().updateCurrentUser(user!) { error in
     
    // Error handling
    }
    [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.