Configurare il suo Servizio App o le Funzioni di Azure per l'accesso con il provider Accedi con Apple (Anteprima)

Questo articolo illustra come configurare Servizio app di Azure o Funzioni di Azure per usare Accedi con Apple come provider di autenticazione.

Per completare la procedura descritta in questo articolo, è necessario registrarsi al programma per sviluppatori Apple. Per iscriversi al programma per sviluppatori Apple, passare a developer.apple.com/programs/enroll.

Attenzione

L'abilitazione dell'accesso con Apple disabilita la gestione della funzionalità autenticazione e autorizzazione del servizio app per l'applicazione tramite alcuni client, ad esempio il portale di Azure, l'interfaccia della riga di comando di Azure e Azure PowerShell. La funzionalità si basa su una nuova superficie API, che, durante l'anteprima, non è ancora usata in tutte le esperienze di gestione.

Creare un'applicazione nel portale Apple Developer

Creare un ID app e un ID servizio nel portale Apple Developer.

  1. Nel portale Apple Developer passare a Certificati, Identificatori e Profili.

  2. Nella scheda Identificatori selezionare il pulsante (+).

  3. Nella pagina Registra un nuovo identificatore scegliere ID app e selezionare Continua. Gli ID app includono uno o più ID di servizio.

    Screenshot che mostra la pagina Registra un nuovo identificatore nel portale per sviluppatori Apple con ID app evidenziati.

  4. Nella pagina Registra un ID app specificare una descrizione e un ID bundle.

  5. Nell'elenco delle funzionalità selezionare Accedi con Applee quindi continua. Prendere nota, in questo passaggio, del Prefisso ID dell'app (ID del team). Sarà necessario in un secondo momento.

    Screenshot che mostra la configurazione di un nuovo identificatore di app nel portale per sviluppatori Apple.

  6. Esaminare le informazioni di registrazione dell'app e selezionare Registra.

  7. Anche in questo caso, nella scheda Identificatori selezionare il pulsante (+).

    Screenshot che mostra la pagina Identificatore con l'icona con il segno più evidenziata nel portale per sviluppatori Apple.

  8. Nella pagina Registra un nuovo identificatore scegliere ID servizi e selezionare Continua.

    Screenshot che mostra la pagina Registra un nuovo identificatore nel portale per sviluppatori Apple con ID servizi evidenziati.

  9. Nella pagina Registra un ID di servizi specificare una descrizione e un identificatore. Selezionare quindi Configura.

    Screenshot che mostra la descrizione e un identificatore.

    La descrizione è ciò che l'utente vede nella schermata di consenso. L'identificatore è l'ID client usato per configurare il provider Apple con il servizio app.

  10. Nella finestra di dialogo impostare l'ID app primaria sull'ID app creato in precedenza. Specificare il dominio dell'applicazione nella sezione dominio. Per l'URL restituito, usare l'URL <app-url>/.auth/login/apple/callback. Ad esempio: https://contoso.azurewebsites.net/.auth/login/apple/callback. Selezionare quindi Aggiungi e Salva.

    Screenshot che mostra la specificazione del dominio e dell'URL di ritorno per la registrazione.

  11. Esaminare le informazioni di registrazione del servizio e quindi selezionare Salva.

Generare il segreto del client

Apple richiede agli sviluppatori di app di creare e firmare un token JSON Web (JWT) come valore del segreto client. Per generare questo segreto, generare e scaricare prima una chiave privata a curva ellittica dal portale Apple Developer. Usare quindi tale chiave per firmare un token JWT con un payload specifico.

Creare e scaricare la chiave privata

  1. Nella scheda Chiavi del portale Apple Developer scegliere Crea una chiave o selezionare il pulsante (+).
  2. Nella pagina Registra una nuova chiave assegnare un nome alla chiave, selezionare Accedi con Apple e selezionare Configura.
  3. Nella pagina Configura chiave collegare la chiave all'ID app primario creato in precedenza e selezionare Salva.
  4. Completare la creazione della chiave confermando le informazioni e selezionando Continua. Esaminare quindi le informazioni e selezionare Registra.
  5. Nella pagina Scarica la chiave scaricare la chiave. Viene scaricato come .p8 file (PKCS#8). Usare il contenuto del file per firmare il token JWT del segreto del client.

Strutturare il token JWT del segreto client

Apple richiede che il segreto client sia la codifica base64 di un token JWT. Il token JWT decodificato deve avere un payload strutturato come nell'esempio seguente:

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: ID cliente Apple, anche ID del servizio
  • iss: ID del team per sviluppatori Apple
  • aud: Apple riceve il token, quindi sono il pubblico
  • exp: Non più di sei mesi dopo nbf

La versione con codifica Base64 di questo payload è simile alla seguente:

eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Nota

Apple non accetta JWT dei segreti client con una data di scadenza superiore a sei mesi dalla creazione, o dalla data nbf. È necessario aggiornare il segreto del client, almeno ogni sei mesi.

Per altre informazioni sulla generazione e la convalida dei token, vedere la documentazione per sviluppatori di Apple.

Firmare il token JWT del segreto client

Si utilizza il .p8 file scaricato in precedenza per firmare il token JWT del segreto client. Questo file è un file PKCS#8 che contiene la chiave di firma privata in formato PEM. Sono disponibili molte librerie che possono creare e firmare automaticamente il token JWT.

Esistono diversi tipi di librerie open source disponibili online per la creazione e la firma di JWT. Per altre informazioni sulla generazione di token JWT, vedere Token Web JSON (JWT).

Ad esempio, un modo per generare il segreto client consiste nell'importare il pacchetto NuGet Microsoft.IdentityModel.Tokens ed eseguire il codice C# illustrato di seguito:

using Microsoft.IdentityModel.Tokens;

public static string GetAppleClientSecret(string teamId, string clientId, string keyId, string p8key)
{
    string audience = "https://appleid.apple.com";

    string issuer = teamId;
    string subject = clientId;
    string kid = keyId;

    IList<Claim> claims = new List<Claim> {
        new Claim ("sub", subject)
    };

    CngKey cngKey = CngKey.Import(Convert.FromBase64String(p8key), CngKeyBlobFormat.Pkcs8PrivateBlob);

    SigningCredentials signingCred = new SigningCredentials(
        new ECDsaSecurityKey(new ECDsaCng(cngKey)),
        SecurityAlgorithms.EcdsaSha256
    );

    JwtSecurityToken token = new JwtSecurityToken(
        issuer,
        audience,
        claims,
        DateTime.Now,
        DateTime.Now.AddDays(180),
        signingCred
    );
    token.Header.Add("kid", kid);
    token.Header.Remove("typ");

    JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

    return tokenHandler.WriteToken(token);
}
  • teamId: ID del team per sviluppatori Apple
  • clientId: ID client Apple, anche l'ID del servizio
  • p8key: chiave di formato PEM. È possibile ottenere la chiave aprendo il .p8 file in un editor di testo e copiando tutto tra -----BEGIN PRIVATE KEY----- e -----END PRIVATE KEY----- senza interruzioni di riga.
  • keyId: ID della chiave scaricata

Questo token restituito è il valore del segreto client usato per configurare il provider Apple.

Importante

Il segreto client è un'importante credenziale di sicurezza. Non condividere questo segreto con nessuno o distribuirlo in un'applicazione client.

Aggiungere il segreto client come impostazione dell'applicazione per l'app, scegliendo un nome di impostazione a piacere. Prendere nota di questo nome per dopo.

Aggiungere informazioni sul provider all'applicazione

Nota

La configurazione necessaria è in un nuovo formato API, attualmente supportato solo dalla configurazione basata su file (anteprima).The required configuration is in a new API format, currently only supported by file-based configuration (preview). È necessario seguire la procedura descritta qui per usare un file di questo tipo.

Questa sezione descrive l'aggiornamento della configurazione per includere il nuovo IDP. Di seguito è riportato un esempio di configurazione.

  1. Nell'oggetto identityProviders aggiungere un apple oggetto se non ne esiste già uno.

  2. Assegnare un oggetto a tale chiave con un registration oggetto al suo interno e, facoltativamente, un login oggetto :

    "apple" : {
       "registration" : {
            "clientId": "<client ID>",
            "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" 
        },
       "login": {
             "scopes": []
       }
    }
    
  3. Nell'oggetto registration, impostare il clientId sull'ID client raccolto.

  4. Nell'oggetto registration impostare clientSecretSettingName sul nome dell'impostazione dell'applicazione in cui è stato archiviato il segreto client.

  5. Nell'oggetto è possibile scegliere di impostare la login matrice in modo da includere un elenco di ambiti usati per l'autenticazione scopes con Apple, ad esempio nome e posta elettronica. Se gli ambiti sono configurati, vengono richiesti in modo esplicito nella schermata di consenso quando gli utenti accedono per la prima volta.

Dopo aver impostato questa configurazione, è possibile usare il provider Apple per l'autenticazione nell'app.

Una configurazione completa potrebbe essere simile all'esempio seguente, in cui l'impostazione APPLE_GENERATED_CLIENT_SECRET punta a un'impostazione dell'applicazione contenente un token JWT generato:

{
    "platform": {
        "enabled": true
    },
    "globalValidation": {
        "redirectToProvider": "apple",
        "unauthenticatedClientAction": "RedirectToLoginPage"
    },
    "identityProviders": {
        "apple": {
            "registration": {
                "clientId": "com.contoso.example.client",
                "clientSecretSettingName": "APPLE_GENERATED_CLIENT_SECRET"
            },
            "login": {
                "scopes": []
            }
        }
    },
    "login": {
        "tokenStore": {
            "enabled": true
        }
    }     
}