Konfigurera din App Service- eller Azure Functions-app för att logga in med en inloggning med Apple-providern (förhandsversion)

Den här artikeln visar hur du konfigurerar Azure App Service eller Azure Functions för att använda Logga in med Apple som autentiseringsprovider.

Om du vill slutföra proceduren i den här artikeln måste du ha registrerat dig i Apple Developer-programmet. Om du vill registrera dig i Apples utvecklarprogram går du till developer.apple.com/programs/enroll.

Varning

Om du aktiverar Inloggning med Apple inaktiveras hanteringen av apptjänstautentiserings-/auktoriseringsfunktionen för ditt program via vissa klienter, till exempel Azure-portalen, Azure CLI och Azure PowerShell. Funktionen förlitar sig på en ny API-yta som under förhandsversionen ännu inte har redovisats i alla hanteringsupplevelser.

Skapa ett program i Apple Developer-portalen

Du måste skapa ett app-ID och ett tjänst-ID i Apple Developer-portalen.

  1. Gå till Certifikat, identifierare och profiler i Apple Developer-portalen.
  2. På fliken Identifierare väljer du knappen (+).
  3. På sidan Registrera en ny identifierare väljer du App-ID: n och väljer Fortsätt. (App-ID:t innehåller ett eller flera tjänst-ID:t.) Registering a new app identifier in the Apple Developer Portal
  4. På sidan Registrera ett app-ID anger du en beskrivning och ett paket-ID och väljer Logga in med Apple i listan över funktioner. Välj sedan Fortsätt. Anteckna ditt app-ID-prefix (team-ID) från det här steget. Du behöver det senare. Configuring a new app identifier in the Apple Developer Portal
  5. Granska appregistreringsinformationen och välj Registrera.
  6. På fliken Identifierare väljer du återigen knappen (+). Creating a new service identifier in the Apple Developer Portal
  7. På sidan Registrera en ny identifierare väljer du Tjänste-ID: n och väljer Fortsätt. Registering a new service identifier in the Apple Developer Portal
  8. På sidan Registrera ett tjänst-ID anger du en beskrivning och en identifierare. Beskrivningen är vad som visas för användaren på medgivandeskärmen. Identifieraren är ditt klient-ID som används för att konfigurera Apple-providern med din apptjänst. Välj sedan Konfigurera. Providing a description and an identifier
  9. I popup-fönstret anger du det primära app-ID:t till det app-ID som du skapade tidigare. Ange programmets domän i domänavsnittet. Använd URL:en för retur-URL:en <app-url>/.auth/login/apple/callback. Exempel: https://contoso.azurewebsites.net/.auth/login/apple/callback Välj sedan Lägg till och Spara. Specifying the domain and return URL for the registration
  10. Granska informationen om tjänstregistrering och välj Spara.

Generera klienthemligheten

Apple kräver att apputvecklare skapar och signerar en JWT-token som klienthemlighetsvärde. Generera den här hemligheten genom att först generera och ladda ned en privat nyckel i en elliptisk kurva från Apple Developer-portalen. Använd sedan den nyckeln för att signera en JWT med en specifik nyttolast.

Skapa och ladda ned den privata nyckeln

  1. På fliken Nycklar i Apple Developer-portalen väljer du Skapa en nyckel eller väljer knappen (+).
  2. På sidan Registrera en ny nyckel ger du nyckeln ett namn, markerar kryssrutan bredvid Logga in med Apple och väljer Konfigurera.
  3. På sidan Konfigurera nyckel länkar du nyckeln till det primära app-ID som du skapade tidigare och väljer Spara.
  4. Slutför skapandet av nyckeln genom att bekräfta informationen och välja Fortsätt och sedan granska informationen och välja Registrera.
  5. På sidan Ladda ned din nyckel laddar du ned nyckeln. Den laddas ned som en .p8 (PKCS#8)-fil – du använder filinnehållet för att signera din klienthemliga JWT.

Strukturera klienthemlighetens JWT

Apple kräver att klienthemligheten är base64-kodning för en JWT-token. Den avkodade JWT-token bör ha en nyttolast strukturerad som det här exemplet:

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: Apples klient-ID (även tjänst-ID)
  • iss: Ditt Apple Developer Team-ID
  • aud: Apple tar emot token, så de är målgruppen
  • exp: Högst sex månader efter nbf

Den base64-kodade versionen av nyttolasten ovan ser ut så här: eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Obs! Apple accepterar inte klienthemliga JWT:er med ett förfallodatum mer än sex månader efter skapandedatumet (eller nbf). Det innebär att du måste rotera din klienthemlighet, minst var sjätte månad.

Mer information om hur du genererar och validerar token finns i Apples utvecklardokumentation.

Signera klienthemlighetens JWT

Du använder filen .p8 som du laddade ned tidigare för att signera klienthemlighetenS JWT. Den här filen är en PCKS#8-fil som innehåller den privata signeringsnyckeln i PEM-format. Det finns många bibliotek som kan skapa och signera JWT åt dig.

Det finns olika typer av bibliotek med öppen källkod tillgängliga online för att skapa och signera JWT-token. Mer information om hur du genererar JWT-token finns i JSON Web Token (JWT). Ett sätt att generera klienthemligheten är till exempel genom att importera NuGet-paketet Microsoft.IdentityModel.Tokens och köra en liten mängd C#-kod som visas nedan.

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: Ditt Apple Developer Team-ID
  • clientId: Apples klient-ID (även tjänst-ID)
  • p8key: PEM-formatnyckeln – du kan hämta nyckeln genom att öppna .p8 filen i en textredigerare och kopiera allt mellan -----BEGIN PRIVATE KEY----- och -----END PRIVATE KEY----- utan radbrytningar
  • keyId: ID för den nedladdade nyckeln

Den här token som returneras är det klienthemlighetsvärde som du använder för att konfigurera Apple-providern.

Viktigt!

Klienthemligheten är en viktig säkerhetsautentiseringsuppgift. Dela inte den här hemligheten med någon eller distribuera den i ett klientprogram.

Lägg till klienthemligheten som en programinställning för appen med ett valfritt inställningsnamn. Anteckna det här namnet för senare.

Lägga till providerinformation i ditt program

Kommentar

Den nödvändiga konfigurationen är i ett nytt API-format, som för närvarande endast stöds av filbaserad konfiguration (förhandsversion). Du måste följa stegen nedan med hjälp av en sådan fil.

Det här avsnittet beskriver hur du uppdaterar konfigurationen för att inkludera din nya IDP. En exempelkonfiguration följer.

  1. identityProviders Lägg till ett apple objekt i objektet om det inte redan finns.

  2. Tilldela ett objekt till den nyckeln med ett registration objekt i den, och eventuellt ett login objekt:

    "apple" : {
       "registration" : {
            "clientId": "<client ID>",
            "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" 
        },
       "login": {
             "scopes": []
       }
    }
    

    a. registration I -objektet anger du clientId till det klient-ID som du samlade in.

    b. registration I objektet anger du clientSecretSettingName namnet på den programinställning där du lagrade klienthemligheten.

    c. I objektet kan du välja att ange matrisen så att den scopes innehåller en lista över omfång som används när du autentiserar login med Apple, till exempel "namn" och "e-post". Om omfång konfigureras begärs de uttryckligen på medgivandeskärmen när användarna loggar in för första gången.

När den här konfigurationen har angetts är du redo att använda Apple-providern för autentisering i din app.

En fullständig konfiguration kan se ut som i följande exempel (där inställningen APPLE_GENERATED_CLIENT_SECRET pekar på en programinställning som innehåller en genererad JWT):

{
    "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
        }
    }     
}

Nästa steg