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.

För att kunna slutföra proceduren i den här artikeln måste du ha registrerat dig i Apple-utvecklarprogrammet. Om du vill registrera dig i Apple-utvecklarprogrammet går du till developer.apple.com/programs/enroll.

Varning

Om du aktiverar inloggning med Apple inaktiveras hanteringen av funktionen App Service-autentisering/auktorisering för ditt program via vissa klienter, till exempel Azure Portal, Azure CLI och Azure PowerShell. Funktionen förlitar sig på en ny API-yta som under förhandsversionen ännu inte redovisas 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. I Apple Developer-portalen går du till Certifikat, Identifierare, & Profiler.
  2. På fliken Identifierare väljer du knappen (+).
  3. På sidan Registrera en ny identifierare väljer du App-ID:n och sedan Fortsätt. (App-ID:t innehåller ett eller flera tjänst-ID:t.) Registrera en ny appidentifierare i 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. Konfigurera en ny appidentifierare i Apple Developer Portal
  5. Granska appregistreringsinformationen och välj Registrera.
  6. På fliken Identifierare väljer du återigen knappen (+). Skapa en ny tjänstidentifierare i Apple Developer Portal
  7. På sidan Registrera en ny identifierare väljer du Tjänst-ID:n och sedan Fortsätt. Registrera en ny tjänstidentifierare i 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. Ange en beskrivning och en identifierare
  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. Till exempel https://contoso.azurewebsites.net/.auth/login/apple/callback. Välj sedan Lägg till och Spara. Ange domänen och returnera URL:en för registreringen
  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 för 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 knappen (+).
  2. På sidan Registrera en ny nyckel ger du nyckeln ett namn, markerar du 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 av en JWT-token. Den avkodade JWT-token bör ha en nyttolast strukturerad som i 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: Apple-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 skapandet (eller nbf) datumet. 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 som är 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: Apple-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 valfritt inställningsnamn. Anteckna det här namnet för senare bruk.

Lägga till providerinformation i ditt program

Anteckning

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 så att den inkluderar din nya IDP. En exempelkonfiguration följer.

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

  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. I - registration objektet anger du clientId till det klient-ID som du samlade in.

    b. I - registration objektet anger du clientSecretSettingName till namnet på programinställningen där du lagrade klienthemligheten.

    c. login I objektet kan du välja att ange matrisen så att den scopes innehåller en lista över omfång som används vid autentisering med Apple, till exempel "namn" och "e-post". Om omfång har konfigurerats 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