Skonfiguruj swoją aplikację App Service lub Azure Functions, aby logować się przy użyciu dostawcy Sign in with Apple (wersja zapoznawcza)

W tym artykule pokazano, jak skonfigurować usługę aplikacji Azure lub Azure Functions do korzystania z logowania przy użyciu 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 usługi Apple wyłącza zarządzanie funkcją uwierzytelniania i 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. Ta funkcja opiera się na nowej powierzchni interfejsu API, która w trakcie korzystania z wersji zapoznawczej nie jest jeszcze uwzględniana we wszystkich środowiskach zarządzania.

Tworzenie aplikacji w portalu dla deweloperów firmy Apple

Utwórz 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.

    Zrzut ekranu przedstawiający stronę Rejestrowanie nowego identyfikatora w portalu dla deweloperów firmy Apple z wyróżnionymi identyfikatorami aplikacji.

  4. Na stronie Rejestrowanie identyfikatora aplikacji podaj opis i identyfikator pakietu.

  5. Z listy możliwości wybierz pozycję Zaloguj się przy użyciu firmy Apple , a następnie wybierz pozycję Kontynuuj. Zanotuj z tego kroku prefiks identyfikatora aplikacji (identyfikator zespołu). Potrzebujesz go później.

    Zrzut ekranu przedstawiający konfigurowanie nowego identyfikatora aplikacji w portalu dla deweloperów firmy Apple.

  6. Przejrzyj informacje o rejestracji aplikacji i wybierz pozycję Zarejestruj.

  7. Ponownie na karcie Identyfikatory wybierz przycisk (+).

    Zrzut ekranu przedstawia stronę Identyfikator z ikoną plusa wyróżnioną w portalu dla deweloperów firmy Apple.

  8. Na stronie Rejestrowanie nowego identyfikatora wybierz pozycję Identyfikatory usług i wybierz pozycję Kontynuuj.

    Zrzut ekranu przedstawiający stronę Rejestrowanie nowego identyfikatora w portalu dla deweloperów firmy Apple z wyróżnionymi identyfikatorami usług.

  9. Na stronie Rejestrowanie identyfikatora usług podaj opis i identyfikator. Następnie wybierz pozycję Konfiguruj.

    Zrzut ekranu przedstawia podanie opisu i identyfikatora.

    Opis jest tym, co użytkownik widzi na ekranie zgody. Ten identyfikator to identyfikator klienta używany podczas konfigurowania dostawcy Apple w usłudze Twojej aplikacji.

  10. W oknie dialogowym 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.

    Zrzut ekranu przedstawia określanie domeny i adresu URL powrotu dla rejestracji.

  11. Przejrzyj informacje o rejestracji usługi, a następnie wybierz pozycję Zapisz.

Generowanie tajemnicy klienta

Firma Apple wymaga od deweloperów aplikacji utworzenia i podpisania JSON Web Token (JWT) jako wartość tajną 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, wybierz pozycję Zaloguj się przy użyciu firmy Apple, a następnie 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. Następnie przejrzyj informacje i wybierz pozycję Zarejestruj.
  5. Na stronie Pobierz klucz pobierz klucz. Pobiera go jako .p8 plik (PKCS#8). Zawartość pliku służy do podpisywania klucza tajnego klienta JWT.

Ustrukturyzuj tajny klucz klienta JWT

Firma Apple wymaga, aby klucz tajny klienta był kodowaniem base64 JWT. Zdekodowany zestaw JWT powinien mieć ładunek ze strukturą podobną do poniższego 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ą więc odbiorcami
  • exp: Nie więcej niż sześć miesięcy po nbf

Wersja tego ładunku zakodowana w formacie base64 wygląda następująco:

eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Uwaga

Firma Apple nie akceptuje tajnych kluczy klientowskich JWT z datą wygaśnięcia przekraczającą sześć miesięcy od daty utworzenia lub nbf. Musisz zmienić klucz tajny klienta przynajmniej raz na sześć miesięcy.

Podpisz tajny klucz klienta JWT

Plik, który pobrałeś wcześniej, służy do podpisywania JWT tajemnicy klienta .p8. Ten plik jest plikiem PKCS#8 zawierającym prywatny klucz podpisywania w formacie PEM. Istnieje wiele bibliotek, które mogą podpisać i wygenerować token JWT dla ciebie.

Istnieją różne rodzaje bibliotek open-source dostępnych online do tworzenia i podpisywania tokenów JWT. Aby uzyskać więcej informacji na temat generowania zestawów JWTs, zobacz JSON Web Token (JWT).

Na przykład jednym ze sposobów generowania tajnego klienta jest zaimportowanie pakietu NuGet Microsoft.IdentityModel.Tokens i uruchomienie kodu C# 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 plik .p8 w edytorze tekstowym i kopiując wszystko między -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- bez podziałów na linie.
  • keyId: identyfikator pobranego klucza

Zwrócony token to wartość klucza tajnego klienta używana do konfigurowania dostawcy firmy Apple.

Ważne

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

Dodaj sekret 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). Aby użyć takiego pliku, należy wykonać kroki opisane tutaj.

W tej sekcji opisano aktualizowanie konfiguracji w celu uwzględnienia nowego dostawcy tożsamości (IDP). Poniżej przedstawiono przykładową konfigurację.

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

  2. Przypisz obiekt do tego klucza, zawierający obiekt registration i opcjonalnie obiekt login:

    "apple" : {
       "registration" : {
            "clientId": "<client ID>",
            "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" 
        },
       "login": {
             "scopes": []
       }
    }
    
  3. W obiekcie registration ustaw identyfikator klienta clientId, który zebrałeś.

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

  5. login W obiekcie można ustawić tablicę scopes tak, aby zawierała listę zakresów używanych podczas uwierzytelniania za pomocą firmy Apple, takich jak nazwa i adres e-mail. Jeśli zakresy są skonfigurowane, są one jawnie żądane na ekranie zgody, gdy użytkownicy logują się po raz pierwszy.

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

Kompletna konfiguracja może wyglądać podobnie do poniższego przykładu, w którym 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
        }
    }     
}