Attivazione dell'autenticazione tra app con il Portachiavi iCloud condiviso

Per condividere gli stati di autenticazione tra più app o estensioni sulle piattaforme Apple, memorizza lo stato di autenticazione in un portachiavi condiviso utilizzando Keychain Services e configura le tue app in modo che utilizzino il portachiavi condiviso.

In questo modo, gli utenti possono:

  • Accedere una volta sola e avere eseguito l'accesso su tutte le app che appartengono allo stesso accesso gruppo.
  • Esci una volta ed esci da tutte le app che appartengono allo stesso accesso gruppo.

Condividi lo stato di autenticazione tra app

Per condividere lo stato di autenticazione tra le app:

  1. Configura un gruppo di accesso per le tue app.

    Puoi utilizzare un gruppo di accesso di portachiavi o un gruppo di app. Per maggiori dettagli, consulta Condividere l'accesso agli elementi del Portachiavi tra una raccolta di app.

    Per configurare un gruppo di accesso al portachiavi, svolgi i seguenti passaggi per ogni app:

    1. In Xcode, vai a Impostazioni progetto > Funzionalità.
    2. Attiva condivisione portachiavi.
    3. Aggiungi un identificatore del gruppo di portachiavi. Utilizza lo stesso identificatore per tutti i delle app di cui vuoi condividere lo stato.
  2. In ogni app, imposta il gruppo di accesso sul gruppo di accesso al portachiavi o sul gruppo di app che hai creato nel passaggio precedente.

    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. In almeno un'app, puoi eseguire l'accesso di un utente con qualsiasi metodo di accesso.

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

    Lo stesso utente corrente è disponibile in tutte le app del gruppo di accesso.

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

Tornare a un portachiavi non condiviso

  1. Imposta il gruppo di accesso su nil per interrompere la condivisione dello stato di autenticazione.

    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. Consenti l'accesso a un utente con qualsiasi metodo di accesso. Lo stato utente non sarà disponibile per altre app.

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

Eseguire la migrazione di un utente che ha eseguito l'accesso a un portachiavi condiviso

Per eseguire la migrazione di un utente che ha già eseguito l'accesso a uno stato condiviso:

  1. Fai riferimento all'utente corrente per un uso futuro.

    var user = Auth.auth().currentUser
    
    FIRUser *user = FIRAuth.auth.currentUser;
    
  2. (Facoltativo) Controlla lo stato di autenticazione del gruppo di accesso che vuoi condividere.

    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. Utilizza un gruppo di accesso impostato in precedenza nelle impostazioni del progetto.

    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. Aggiorna l'utente corrente.

    Auth.auth().updateCurrentUser(user!) { error in
      // Error handling
    }
    
    [FIRAuth.auth updateCurrentUser:user completion:^(NSError * _Nullable error) {
      // Error handling
    }];
    
  5. Ora l'utente può essere raggiunto da altre app che hanno accesso allo stesso gruppo di accesso.