Настройте приложение App Service или Azure Functions для входа через Apple ID (предварительная версия).

В этой статье показано, как настроить Службу приложений Azure или Функции Azure для использования входа с помощью Apple в качестве поставщика проверки подлинности.

Чтобы выполнить процедуру в этой статье, необходимо зарегистрировать в программе разработчика Apple. Чтобы зарегистрироваться в программе Apple Developer, перейдите по адресу developer.apple.com/programs/enroll.

Внимание

Включение входа с помощью Apple отключает управление функцией проверки подлинности и авторизации службы приложений для приложения с помощью некоторых клиентов, таких как портал Azure, Azure CLI и Azure PowerShell. Эта функция использует новую область API, которая во время предварительной версии еще не учитывается во всех интерфейсах управления.

Создание приложения на портале разработчика Apple

Создайте идентификатор приложения и идентификатор службы на портале разработчика Apple.

  1. На портале Apple Developer выберите Certificates, Identifiers, & Profiles (Сертификаты, идентификаторы и профили).

  2. На вкладке Identifiers (Идентификаторы) нажмите кнопку (+).

  3. На странице Register a New Identifier (Регистрация нового идентификатора) выберите App IDs (Идентификаторы приложений) и нажмите кнопку Continue (Продолжить). Идентификаторы приложений включают один или несколько идентификаторов служб.

    Снимок экрана: страница регистрации нового идентификатора на портале разработчика Apple с выделенными идентификаторами приложений.

  4. На странице "Регистрация идентификатора приложения" укажите описание и идентификатор пакета.

  5. В списке возможностей выберите "Войти" с помощью Apple И нажмите кнопку "Продолжить". Запишите префикс идентификатора приложения (идентификатор группы) на этом шаге. Он понадобится вам позже.

    Снимок экрана: настройка нового идентификатора приложения на портале разработчика Apple.

  6. Проверьте сведения о регистрации приложения и нажмите кнопку Register (Зарегистрировать).

  7. На вкладке Identifiers (Идентификаторы) еще раз нажмите кнопку (+).

    Снимок экрана: страница идентификатора со значком плюса, выделенным на портале разработчика Apple.

  8. На странице Register a New Identifier (Регистрация нового идентификатора) выберите Services IDs (Идентификаторы служб) и нажмите кнопку Continue (Продолжить).

    Снимок экрана: страница регистрации нового идентификатора на портале разработчика Apple с выделенными идентификаторами служб.

  9. На странице Register a Services ID (Регистрация идентификатора службы) укажите описание и идентификатор. Затем выберите Настроить.

    Снимок экрана: указание описания и идентификатора.

    Описание — это то, что пользователь видит на экране согласия. Идентификатор - это ваш клиентский ID, используемый при настройке поставщика Apple для вашей службы приложений.

  10. В диалоговом окне задайте идентификатор основного приложения в идентификатор приложения, созданный ранее. Укажите домен приложения в разделе "Domain" (Домен). В качестве URL-адреса возврата укажите URL-адрес <app-url>/.auth/login/apple/callback. Например, https://contoso.azurewebsites.net/.auth/login/apple/callback. Затем выберите Add (Добавить) и Save (Сохранить).

    Снимок экрана: указание домена и URL-адреса возврата для регистрации.

  11. Просмотрите сведения о регистрации службы и нажмите кнопку "Сохранить".

Создание секрета клиента

Apple требует от разработчиков приложений создавать и подписывать веб-токен JSON (JWT) в качестве значения секрета клиента. Чтобы создать этот секрет, сначала создайте и скачайте закрытый ключ на основе эллиптических кривых на портале Apple Developer. Затем используйте этот ключ, чтобы подписать JWT с помощью конкретной полезной нагрузки.

Создание и скачивание закрытого ключа

  1. На вкладке Keys (Ключи) на портале Apple Developer выберите Create a key (Создать ключ) или нажмите кнопку (+).
  2. На странице "Регистрация нового ключа " укажите имя ключа, выберите "Войти с помощью Apple" и нажмите кнопку "Настроить".
  3. На странице Configure Key (Настройка ключа) свяжите ключ с основным идентификатором приложения, созданным ранее, и выберите Save (Сохранить).
  4. Завершите создание ключа, подтвердите сведения и нажмите кнопку "Продолжить". Затем просмотрите сведения и выберите "Зарегистрировать".
  5. На странице Download Your Key (скачивание ключа) скачайте ключ. Он загружается как файл .p8 PKCS#8. Содержимое файла используется для подписывания секрета клиента JWT.

Структурирование JWT ключа клиента

Apple требует, чтобы секрет клиента был кодировкой base64 JWT. Декодированный JWT должен иметь нагрузку, структурированную примерно следующим образом:

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: Идентификатор клиента Apple, а также идентификатор службы
  • iss: ваш идентификатор команды Apple Developer;
  • aud: Компании Apple передается токен, следовательно, она является аудиторией.
  • exp: не более шести месяцев после nbf.

Версия полезных данных в кодировке Base64 выглядит следующим образом:

eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Примечание.

Apple не принимает JWT, у которых секретный ключ с сроком действия более шести месяцев после создания или даты nbf. Необходимо сменить секрет клиента, как минимум, каждые шесть месяцев.

Дополнительные сведения о создании и проверке маркеров см. в документации разработчика Apple.

Подпишите секрет JWT клиента

Файл .p8, скачанный ранее, используется для подписания JWT-секрета клиента. Этот файл представляет собой PKCS#8-файл , содержащий закрытый ключ подписи в формате PEM. Существует множество библиотек, которые могут создавать и подписывать JWT.

Существуют различные типы библиотек с открытым исходным кодом, доступные в Интернете для создания и подписывания JWTs. Дополнительные сведения о создании JWT см. в статье JSON Web Token (JWT).

Например, одним из способов создания секрета клиента является импорт пакета NuGet Microsoft.IdentityModel.Token и запуск кода C#, показанного здесь:

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: ваш идентификатор группы разработчиков Apple.
  • clientId: Идентификатор клиента Apple, а также идентификатор службы
  • p8key: ключ формата PEM. Ключ можно получить, открыв .p8 файл в текстовом редакторе и скопировав все между -----BEGIN PRIVATE KEY----- и -----END PRIVATE KEY----- без разрывов строк.
  • keyId: идентификатор скачанного ключа.

Этот токен является значением секрета клиента, которое используется для конфигурации поставщика Apple.

Внимание

Секрет клиента — это важные учетные данные безопасности. Не делитесь этим секретом с кем-либо или не распространяйте его в клиентском приложении.

Добавьте секрет клиента в качестве параметра приложения, используя произвольное имя параметра. Запишите это имя для последующего использования.

Добавление сведений о поставщике в приложение

Примечание.

Требуемая конфигурация находится в новом формате API, и в настоящее время она поддерживается только конфигурацией на основе файлов (предварительная версия). Чтобы использовать такой файл, выполните указанные здесь действия.

В этом разделе описывается обновление конфигурации для включения вашего нового поставщика удостоверений (IDP). Пример конфигурации см. ниже.

  1. identityProviders В объекте добавьте apple объект, если он еще не существует.

  2. Назначьте объект этому ключу, поместив в него объект registration и при необходимости объект login:

    "apple" : {
       "registration" : {
            "clientId": "<client ID>",
            "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" 
        },
       "login": {
             "scopes": []
       }
    }
    
  3. В объекте registration задайте clientId идентификатор клиента, который вы собрали.

  4. В объекте registration задайте clientSecretSettingName имя параметра приложения, в котором хранится секрет клиента.

  5. login В объекте можно задать scopes массив для включения списка областей, используемых при проверке подлинности с помощью Apple, таких как имя и электронная почта. Если области настроены, они явно запрашиваются на экране согласия при первом входе пользователей.

После настройки этой конфигурации вы будете готовы использовать провайдер Apple, который вы настроили, в качестве аутентификации в приложении.

Полная конфигурация может выглядеть следующим образом, где параметр APPLE_GENERATED_CLIENT_SECRET указывает на параметр приложения, содержащий созданный 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
        }
    }     
}