Konfigurowanie aplikacji App Service lub Azure Functions w celu logowania się przy użyciu dostawcy logowania za pomocą firmy Apple (wersja zapoznawcza)

W tym artykule pokazano, jak skonfigurować usługę aplikacja systemu Azure lub usługę Azure Functions do korzystania z funkcji logowania przy użyciu firmy Apple jako dostawcy uwierzytelniania.

Aby wykonać procedurę opisaną w tym artykule, musisz zarejestrować się w programie dla deweloperów firmy Apple. Aby zarejestrować się w programie dla deweloperów firmy Apple, przejdź do developer.apple.com/programs/enroll.

Uwaga

Włączenie logowania przy użyciu firmy Apple spowoduje wyłączenie zarządzania funkcją uwierzytelniania/autoryzacji usługi App Service dla aplikacji za pośrednictwem niektórych klientów, takich jak witryna Azure Portal, interfejs wiersza polecenia platformy Azure i program Azure PowerShell. Funkcja opiera się na nowej powierzchni interfejsu API, która w wersji zapoznawczej nie jest jeszcze uwzględniana we wszystkich środowiskach zarządzania.

Tworzenie aplikacji w portalu dla deweloperów firmy Apple

Musisz utworzyć identyfikator aplikacji i identyfikator usługi w portalu dla deweloperów firmy Apple.

  1. W portalu dla deweloperów firmy Apple przejdź do pozycji Certyfikaty, Identyfikatory i profile.
  2. Na karcie Identyfikatory wybierz przycisk (+).
  3. Na stronie Rejestrowanie nowego identyfikatora wybierz pozycję Identyfikatory aplikacji i wybierz pozycję Kontynuuj. (Identyfikatory aplikacji obejmują co najmniej jeden identyfikator usługi). Registering a new app identifier in the Apple Developer Portal
  4. Na stronie Rejestrowanie identyfikatora aplikacji podaj opis i identyfikator pakietu, a następnie wybierz pozycję Zaloguj się przy użyciu firmy Apple z listy możliwości. Następnie wybierz pozycję Kontynuuj. Zanotuj prefiks identyfikatora aplikacji (identyfikator zespołu) z tego kroku. Będzie on potrzebny później. Configuring a new app identifier in the Apple Developer Portal
  5. Przejrzyj informacje o rejestracji aplikacji i wybierz pozycję Zarejestruj.
  6. Ponownie na karcie Identyfikatory wybierz przycisk (+). Creating a new service identifier in the Apple Developer Portal
  7. Na stronie Rejestrowanie nowego identyfikatora wybierz pozycję Identyfikatory usług i wybierz pozycję Kontynuuj. Registering a new service identifier in the Apple Developer Portal
  8. Na stronie Rejestrowanie identyfikatora usług podaj opis i identyfikator. Opis będzie wyświetlany użytkownikowi na ekranie zgody. Identyfikator będzie identyfikatorem klienta używanym podczas konfigurowania dostawcy firmy Apple w usłudze aplikacji. Następnie wybierz pozycję Konfiguruj. Providing a description and an identifier
  9. W oknie podręcznym ustaw identyfikator aplikacji podstawowej na utworzony wcześniej identyfikator aplikacji. Określ domenę aplikacji w sekcji domeny. W przypadku zwracanego adresu URL użyj adresu URL <app-url>/.auth/login/apple/callback. Na przykład https://contoso.azurewebsites.net/.auth/login/apple/callback. Następnie wybierz pozycję Dodaj i Zapisz. Specifying the domain and return URL for the registration
  10. Przejrzyj informacje o rejestracji usługi i wybierz pozycję Zapisz.

Generowanie wpisu tajnego klienta

Firma Apple wymaga od deweloperów aplikacji utworzenia i podpisania tokenu JWT jako wartości klucza tajnego klienta. Aby wygenerować ten wpis tajny, najpierw wygeneruj i pobierz klucz prywatny krzywej eliptycznej z portalu Apple Developer Portal. Następnie użyj tego klucza, aby podpisać JWT za pomocą określonego ładunku.

Tworzenie i pobieranie klucza prywatnego

  1. Na karcie Klucze w portalu dla deweloperów firmy Apple wybierz pozycję Utwórz klucz lub wybierz przycisk (+).
  2. Na stronie Rejestrowanie nowego klucza podaj nazwę klucza, zaznacz pole wyboru obok pozycji Zaloguj się przy użyciu firmy Apple i wybierz pozycję Konfiguruj.
  3. Na stronie Konfigurowanie klucza połącz klucz z utworzonym wcześniej identyfikatorem aplikacji podstawowej i wybierz pozycję Zapisz.
  4. Zakończ tworzenie klucza, potwierdzając informacje i wybierając pozycję Kontynuuj, a następnie przeglądając informacje i wybierając pozycję Zarejestruj.
  5. Na stronie Pobierz klucz pobierz klucz. Zostanie pobrany jako .p8 plik (PKCS#8) — użyjesz zawartości pliku do podpisania klucza tajnego klienta JWT.

Struktura klucza tajnego klienta JWT

Firma Apple wymaga, aby klucz tajny klienta był kodowaniem base64 tokenu JWT. Zdekodowany token JWT powinien mieć ładunek ze strukturą podobną do tego przykładu:

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: Identyfikator klienta firmy Apple (również identyfikator usługi)
  • iss: Identyfikator zespołu deweloperów firmy Apple
  • aud: Firma Apple otrzymuje token, więc są odbiorcami
  • exp: Nie więcej niż sześć miesięcy po nbf

Wersja zakodowana w formacie base64 powyższego ładunku wygląda następująco: eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Uwaga: firma Apple nie akceptuje tajnych zestawów JWTs klienta z datą wygaśnięcia ponad sześć miesięcy po dacie utworzenia (lub nbf). Oznacza to, że musisz obracać klucz tajny klienta co najmniej co sześć miesięcy.

Więcej informacji na temat generowania i weryfikowania tokenów można znaleźć w dokumentacji dla deweloperów firmy Apple.

Podpisywanie klucza tajnego klienta JWT

Użyjesz pobranego .p8 wcześniej pliku, aby podpisać klucz tajny klienta JWT. Ten plik jest plikiem PCKS#8 zawierającym prywatny klucz podpisywania w formacie PEM. Istnieje wiele bibliotek, które mogą utworzyć i podpisać zestaw JWT.

Istnieją różne rodzaje bibliotek typu open source dostępne w trybie online do tworzenia i podpisywania tokenów JWT. Aby uzyskać więcej informacji na temat generowania tokenów JWT, zobacz JSON Web Token (JWT). Na przykład jednym ze sposobów generowania wpisu tajnego klienta jest zaimportowanie pakietu NuGet Microsoft.IdentityModel.Tokens i uruchomienie niewielkiej ilości kodu W# pokazanego poniżej.

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: Identyfikator zespołu deweloperów firmy Apple
  • clientId: identyfikator klienta firmy Apple (również identyfikator usługi)
  • p8key: klucz formatu PEM — klucz można uzyskać, otwierając .p8 plik w edytorze tekstów i kopiując wszystko między -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- i bez podziałów wierszy
  • keyId: identyfikator pobranego klucza

Zwrócony token jest wartością wpisu tajnego klienta, której użyjesz do skonfigurowania dostawcy firmy Apple.

Ważne

Wpis tajny klienta jest ważnym poświadczenie zabezpieczeń. Nie udostępniaj tego wpisu tajnego nikomu ani nie rozpowszechniaj go w aplikacji klienckiej.

Dodaj klucz tajny klienta jako ustawienie aplikacji, używając wybranej nazwy ustawienia. Zanotuj tę nazwę później.

Dodawanie informacji o dostawcy do aplikacji

Uwaga

Wymagana konfiguracja jest w nowym formacie interfejsu API, obecnie obsługiwana tylko przez konfigurację opartą na plikach (wersja zapoznawcza). Należy wykonać poniższe kroki przy użyciu takiego pliku.

Ta sekcja przeprowadzi Cię przez proces aktualizowania konfiguracji w celu uwzględnienia nowego dostawcy tożsamości. Poniżej przedstawiono przykładową konfigurację.

  1. W obiekcie identityProviders dodaj apple obiekt, jeśli jeszcze nie istnieje.

  2. Przypisz obiekt do tego klucza z obiektem registration w nim i opcjonalnie login obiekt:

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

    a. W obiekcie registration ustaw clientId identyfikator klienta, który został zebrany.

    b. registration W obiekcie ustaw clientSecretSettingName nazwę ustawienia aplikacji, w którym przechowywany jest klucz tajny klienta.

    c. login W obiekcie można ustawić tablicę scopes tak, aby zawierała listę zakresów używanych podczas uwierzytelniania za pomocą firmy Apple, na przykład "name" i "email". Jeśli zakresy są skonfigurowane, będą one jawnie żądane na ekranie zgody, gdy użytkownicy logują się po raz pierwszy.

Po ustawieniu tej konfiguracji możesz używać dostawcy firmy Apple do uwierzytelniania w aplikacji.

Kompletna konfiguracja może wyglądać podobnie do poniższego przykładu (gdzie ustawienie APPLE_GENERATED_CLIENT_SECRET wskazuje ustawienie aplikacji zawierające wygenerowane 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
        }
    }     
}

Następne kroki