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.
- No Portal do Desenvolvedor da Apple, acesse Certificados, Identificadores, e Perfis.
- Na guia Identificadores, selecione o botão (+) .
- 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.)
- 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.
- Revise as informações de registro do aplicativo e selecione Registrar.
- Na guia Identificadores, selecione o botão (+) .
- Na página Registrar um Novo Identificador, escolha IDs de Serviços e selecione Continuar.
- 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.
- 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. - 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
- Na guia Chaves no Portal do Desenvolvedor da Apple, escolha Criar uma chave ou selecione o botão (+) .
- Na página Registrar uma Nova Chave, dê um nome à chave, marque a caixa ao lado de Entrar com a Apple e selecione Configurar.
- Na página Configurar chave, vincule a chave à ID do aplicativo primário que você criou anteriormente e selecione Salvar.
- Conclua a criação da chave confirmando as informações e selecionando Continuar e, em seguida, revise as informações e selecione Registrar.
- 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.
No objeto
identityProviders
, adicione um objetoapple
se ele ainda não existir.Atribua um objeto a essa chave com um objeto
registration
incluído e, opcionalmente, um objetologin
:"apple" : { "registration" : { "clientId": "<client ID>", "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" }, "login": { "scopes": [] } }
a. No objeto
registration
, definaclientId
como a ID do cliente que você coletou.b. Dentro do objeto
registration
, definaclientSecretSettingName
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 matrizscopes
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
}
}
}