Compartilhar via


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.) Registrando um novo identificador de aplicativo no Portal do desenvolvedor da Apple
  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. Como configurar um novo identificador de aplicativo no Portal do Desenvolvedor da Apple
  5. Revise as informações de registro do aplicativo e selecione Registrar.
  6. Na guia Identificadores, selecione o botão (+) . Como criar um identificador de serviço no Portal do Desenvolvedor da Apple
  7. Na página Registrar um Novo Identificador, escolha IDs de Serviços e selecione Continuar. Como registrar um novo identificador de serviço no Portal do Desenvolvedor da Apple
  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. Como fornecer uma descrição e um identificador
  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. Como especificar o domínio e a URL de retorno para o registro
  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