Configure seu serviço de aplicativo ou aplicativo Azure Functions para Entrar usando uma entrada com o provedor Apple (versão prévia)

Este artigo mostra como configurar o Serviço de Aplicativo do Azure ou o Azure Functions para Entrar com Apple (Azure AD) como um provedor de autenticação.

Para concluir o procedimento neste artigo, você deve estar registrado no programa de desenvolvedor da Apple. Para se registrar no programa de desenvolvedor da Apple, acesse developer.apple.com/programs/enroll.

Cuidado

Habilitar a entrada com a Apple desabilitará o gerenciamento do recurso de autenticação/autorização do serviço de aplicativo para seu aplicativo por meio de alguns clientes, como o portal do Azure, CLI do Azure e Azure PowerShell. O recurso depende de uma nova superfície de API que, durante a versão prévia, ainda não foi contabilizada em todas as experiências de gerenciamento.

Crie um aplicativo no Portal do Desenvolvedor da Apple

Você precisará criar uma ID do aplicativo e uma ID de serviço no Portal do Desenvolvedor da Apple.

  1. No Portal do Desenvolvedor da Apple, acesse Certificados, Identificadores, e Perfis.
  2. Na guia Identificadores, selecione o botão (+) .
  3. Na página Registrar um Novo Identificador, escolha IDs de aplicativo e selecione Continuar. (As IDs de aplicativo incluem uma ou mais IDs de serviço.) Registering a new app identifier in the Apple Developer Portal
  4. Na página Registrar uma ID do Aplicativo, forneça uma descrição e uma ID de pacote e selecione Entrar com a Apple na lista de recursos. Depois selecione Continuar. Anote o prefixo da ID do Aplicativo (ID da Equipe) nesta etapa, você precisará dele mais tarde. Configuring a new app identifier in the Apple Developer Portal
  5. Revise as informações de registro do aplicativo e selecione Registrar.
  6. Na guia Identificadores, selecione o botão (+) . Creating a new service identifier in the Apple Developer Portal
  7. Na página Registrar um Novo Identificador, escolha IDs de Serviços e selecione Continuar. Registering a new service identifier in the Apple Developer Portal
  8. Na página Registrar uma ID de Serviços, forneça uma descrição e um identificador. A descrição é o que será exibido para o usuário na tela de consentimento. O identificador será a sua ID de cliente usada na configuração do provedor da Apple com o serviço de aplicativo. Em seguida, selecione Configurar. Providing a description and an identifier
  9. Na janela pop-up, defina a ID do Aplicativo Primário como a ID do Aplicativo que você criou anteriormente. Especifique o domínio do aplicativo na seção domínio. Para a URL de retorno, use a URL <app-url>/.auth/login/apple/callback. Por exemplo, https://contoso.azurewebsites.net/.auth/login/apple/callback. Em seguida, selecione Adicionar e Salvar. Specifying the domain and return URL for the registration
  10. Revise as informações de registro do serviço e selecione Salvar.

Gerar o segredo do cliente

A Apple exige que os desenvolvedores de aplicativos criem e assinem um token JWT como o valor de segredo do cliente. Para gerar esse segredo, primeiro gere e baixe uma chave privada de curva elíptica do Portal do Desenvolvedor da Apple. Em seguida, use essa chave para assinar um JWT com uma payload específica.

Crie e baixe a chave privada

  1. Na guia Chaves no Portal do Desenvolvedor da Apple, escolha Criar uma chave ou selecione o botão (+) .
  2. Na página Registrar uma Nova Chave, dê um nome à chave, marque a caixa ao lado de Entrar com a Apple e selecione Configurar.
  3. Na página Configurar chave, vincule a chave à ID do aplicativo primário que você criou anteriormente e selecione Salvar.
  4. Conclua a criação da chave confirmando as informações e selecionando Continuar e, em seguida, revise as informações e selecione Registrar.
  5. Na página Baixar sua Chave, baixe a chave. Ela será baixado como um .p8 arquivo (PKCS # 8). Você usará o conteúdo do arquivo para assinar o JWT do segredo do cliente.

Estruture o JWT do segredo do cliente

A Apple exige que o segredo do cliente seja a codificação Base64 de um token JWT. O token JWT decodificado deve ter um payload estruturado como este exemplo:

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: a ID do cliente da Apple (também a ID do serviço)
  • ISS: sua ID da Equipe de Desenvolvedores da Apple
  • AUD: a Apple está recebendo o token, portanto, é o público-alvo
  • exp: não mais do que seis meses após NBF

A versão codificada em base64 do payload acima tem esta aparência: eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Observação: a Apple não aceita JWTs do segredo do cliente com uma data de validade superior a seis meses após a data de criação (ou nbf). Isso significa que você precisará girar o segredo do cliente, no mínimo, a cada seis meses.

Mais informações sobre como gerar e validar tokens podem ser encontradas na documentação do desenvolvedor da Apple.

Assine o JWT do segredo cliente

Você usará o .p8 arquivo baixado anteriormente para assinar o JWT do segredo do cliente. Esse arquivo é um arquivo PCKS#8 que contém a chave de assinatura privada no formato PEM. Há muitas bibliotecas que podem criar e assinar o JWT para você.

Diferentes tipos de bibliotecas de software livre estão disponíveis online para criar e assinar tokens JWT. Para obter mais informações sobre como gerar tokens JWT, confira JWT (Token Web JSON). Por exemplo, uma maneira de gerar o segredo do cliente é importando o pacote NuGet Microsoft. IdentityModel.Tokens e executando uma pequena quantidade de código C# mostrado abaixo.

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: sua ID da Equipe de Desenvolvedores da Apple
  • clientId: a ID do cliente da Apple (também a ID do serviço)
  • p8key: a chave de formato PEM. Você pode obter a chave abrindo o .p8 arquivo em um editor de texto e copiando tudo entre -----BEGIN PRIVATE KEY----- e -----END PRIVATE KEY----- sem quebras de linha
  • keyId: a ID da chave baixada

O token retornado é o valor de segredo do cliente que você usará para configurar o provedor da Apple.

Importante

O segredo do cliente é uma credencial de segurança importante. Não compartilhe essa senha com ninguém nem distribua-a em um aplicativo cliente.

Adicione o segredo do cliente como uma configuração de aplicativo para o aplicativo, usando um nome de configuração de sua escolha. Anote este nome para usar mais tarde.

Adicione informações do provedor ao seu aplicativo

Observação

A configuração necessária está em um novo formato de API, que atualmente só tem suporte da Configuração baseada em arquivo (versão prévia). Você precisará seguir as etapas a seguir usando esse arquivo.

Esta seção explicará como atualizar a configuração para incluir o novo IDP. A seguir, temos um exemplo de configuração.

  1. No objeto identityProviders, adicione um objeto apple se ele ainda não existir.

  2. Atribua um objeto a essa chave com um objeto registration incluído e, opcionalmente, um objeto login:

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

    a. No objeto registration, defina clientId como a ID do cliente que você coletou.

    b. Dentro do objeto registration, defina clientSecretSettingName como o nome da configuração do aplicativo em que você armazenou o segredo do cliente.

    c. Dentro do objeto login, você pode optar por definir a matriz scopes para incluir uma lista de escopos usados ao autenticar com a Apple, como "nome" e "e-mail". Se os escopos estiverem configurados, eles serão explicitamente solicitados na tela de consentimento quando os usuários entrarem pela primeira vez.

Depois que essa configuração tiver sido definida, você estará pronto para usar o provedor Apple para autenticação no aplicativo.

Uma configuração completa pode ser semelhante ao exemplo a seguir (em que a configuração APPLE_GENERATED_CLIENT_SECRET aponta para uma configuração de aplicativo que contém um JWT gerado):

{
    "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
        }
    }     
}

Próximas etapas