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.
- I Apple Developer-portalen går du till Certifikat, Identifierare, & Profiler.
- På fliken Identifierare väljer du knappen (+).
- 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.)
- 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.
- Granska appregistreringsinformationen och välj Registrera.
- På fliken Identifierare väljer du återigen knappen (+).
- På sidan Registrera en ny identifierare väljer du Tjänst-ID:n och sedan Fortsätt.
- 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.
- 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 exempelhttps://contoso.azurewebsites.net/.auth/login/apple/callback
. Välj sedan Lägg till och Spara. - 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
- På fliken Nycklar i Apple Developer-portalen väljer du Skapa en nyckel eller knappen (+).
- På sidan Registrera en ny nyckel ger du nyckeln ett namn, markerar du kryssrutan bredvid Logga in med Apple och väljer Konfigurera.
- På sidan Konfigurera nyckel länkar du nyckeln till det primära app-ID som du skapade tidigare och väljer Spara.
- Slutför skapandet av nyckeln genom att bekräfta informationen och välja Fortsätt och sedan granska informationen och välja Registrera.
- 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.
identityProviders
Lägg till ettapple
objekt i objektet om det inte redan finns ett objekt.Tilldela ett objekt till den nyckeln med ett
registration
-objekt i den, och eventuellt ettlogin
-objekt:"apple" : { "registration" : { "clientId": "<client ID>", "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" }, "login": { "scopes": [] } }
a. I -
registration
objektet anger duclientId
till det klient-ID som du samlade in.b. I -
registration
objektet anger duclientSecretSettingName
till namnet på programinställningen där du lagrade klienthemligheten.c.
login
I objektet kan du välja att ange matrisen så att denscopes
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
}
}
}