Autenticar aplicativos JavaScript nos serviços do Azure durante o desenvolvimento local usando entidades de serviço
Artigo
Quando você cria aplicativos na nuvem, os desenvolvedores precisam depurar e testar aplicativos em suas estações de trabalho locais. Quando um aplicativo é executado na estação de trabalho de um desenvolvedor durante o desenvolvimento local, ele ainda deve se autenticar em todos os serviços do Azure usados pelo aplicativo. Este artigo aborda como configurar objetos principais de serviço de aplicativo dedicados a serem usados durante o desenvolvimento local.
Entidades de serviço de aplicativo dedicadas para desenvolvimento local permitem que você siga o princípio de menor privilégio durante o desenvolvimento de aplicativos. Como as permissões têm como escopo exatamente o que é necessário para o aplicativo durante o desenvolvimento, o código do aplicativo é impedido de acessar acidentalmente um recurso do Azure destinado ao uso por um aplicativo diferente. Esse método também evita que bugs ocorram quando o aplicativo é movido para produção porque o aplicativo foi superprivilegiado no ambiente de desenvolvimento.
Uma entidade de serviço de aplicativo é configurada para o aplicativo quando o aplicativo é registrado no Azure. Ao registrar aplicativos para desenvolvimento local, recomenda-se:
Crie registros de aplicativo separados para cada desenvolvedor que trabalha no aplicativo. Esse método cria entidades de serviço de aplicativo separadas para cada desenvolvedor usar durante o desenvolvimento local e evita a necessidade de os desenvolvedores compartilharem credenciais para uma única entidade de serviço de aplicativo.
Crie registos de aplicações separados por aplicação. Isso define o escopo das permissões do aplicativo apenas para o que é necessário para o aplicativo.
Durante o desenvolvimento local, as variáveis de ambiente são definidas com a identidade da entidade de serviço do aplicativo. O SDK do Azure para JavaScript lê essas variáveis de ambiente e usa essas informações para autenticar o aplicativo nos recursos do Azure de que ele precisa.
1 - Registar a aplicação no Azure
Os objetos principais do serviço de aplicativo são criados com um registro de aplicativo no Azure. Você pode criar entidades de serviço usando o portal do Azure ou a CLI do Azure.
Insira registros de aplicativos na barra de pesquisa na parte superior do portal do Azure.
Selecione o item rotulado Registros de aplicativos sob o título Serviços no menu que aparece abaixo da barra de pesquisa.
Na página Registos da aplicação, selecione + Novo registo.
Na página Registar uma candidatura, preencha o formulário da seguinte forma.
Nome → Insira um nome para o registro do aplicativo no Azure. Recomenda-se que esse nome inclua o nome do aplicativo, o usuário para o qual o registro do aplicativo é feito e um identificador como 'dev' para indicar que esse registro de aplicativo é para uso no desenvolvimento local.
Tipos de conta suportados → Contas somente neste diretório organizacional.
Selecione Registrar para registrar seu aplicativo e criar a entidade de serviço do aplicativo.
Na página Registo da aplicação para a sua aplicação:
ID do aplicativo (cliente) → Esta é a ID do aplicativo que o aplicativo usará para acessar o Azure durante o desenvolvimento local. Copie esse valor para um local temporário em um editor de texto, pois você precisará dele em uma etapa futura.
ID do diretório (locatário) → Esse valor também será necessário para seu aplicativo quando ele se autenticar no Azure. Copie esse valor para um local temporário em um editor de texto, ele também será necessário em uma etapa futura.
Credenciais do cliente → Você deve definir as credenciais do cliente para o aplicativo antes que seu aplicativo possa se autenticar no Azure e usar os serviços do Azure. Selecione Adicionar um certificado ou segredo para adicionar credenciais ao seu aplicativo.
Na página Certificados & segredos, selecione + Novo segredo do cliente.
A caixa de diálogo Adicionar um segredo do cliente aparecerá no lado direito da página. Nesta caixa de diálogo:
Descrição → Insira um valor de Atual.
Expira → Selecione um valor de 24 meses.
Selecione Adicionar para adicionar o segredo.
Na página Certificados & segredos, você verá o valor do segredo do cliente.
Copie esse valor para um local temporário em um editor de texto, pois você precisará dele em uma etapa futura.
IMPORTANTE: Esta é a única vez que você verá esse valor. Depois de sair ou atualizar esta página, você não poderá ver esse valor novamente. Você pode adicionar mais segredos de cliente sem invalidar esse segredo de cliente, mas não verá esse valor novamente.
Primeiro, use o comando az ad sp create-for-rbac para criar uma nova entidade de serviço para o aplicativo. Isso cria o registro do aplicativo ao mesmo tempo.
az ad sp create-for-rbac --name {service-principal-name}
A saída deste comando se parece com o seguinte objeto JSON. É recomendável copiar essa saída em um arquivo temporário em um editor de texto, pois você precisará desses valores em uma etapa futura, pois este é o único lugar em que você vê o segredo do cliente (senha) para a entidade de serviço. No entanto, você pode adicionar uma nova senha mais tarde sem invalidar a entidade de serviço ou as senhas existentes, se necessário.
2 - Criar um grupo de segurança Microsoft Entra para desenvolvimento local
Como normalmente há vários desenvolvedores que trabalham em um aplicativo, é recomendável criar um grupo do Microsoft Entra para encapsular as funções (permissões) de que o aplicativo precisa no desenvolvimento local, em vez de atribuir as funções a objetos principais de serviço individuais. Isto oferece as seguintes vantagens.
Todos os desenvolvedores têm a garantia de ter as mesmas funções atribuídas, uma vez que as funções são atribuídas no nível do grupo.
Se uma nova função for necessária para o aplicativo, ela só precisará ser adicionada ao grupo Microsoft Entra para o aplicativo.
Se um novo desenvolvedor ingressar na equipe, uma nova entidade de serviço de aplicativo será criada para o desenvolvedor e adicionada ao grupo, garantindo que o desenvolvedor tenha as permissões certas para trabalhar no aplicativo.
Navegue até a página ID do Microsoft Entra no portal do Azure digitando ID do Microsoft Entra na caixa de pesquisa na parte superior da página e selecionando ID do Microsoft Entra em serviços.
Na página ID do Microsoft Entra , selecione Grupos no menu à esquerda.
Na página Todos os grupos, selecione Novo grupo.
Na página Novo Grupo:
Tipo de grupo → Segurança
Nome do grupo → Um nome para o grupo de segurança, normalmente criado a partir do nome do aplicativo. Também é útil incluir uma cadeia de caracteres como local-dev no nome do grupo para indicar a finalidade do grupo.
Descrição do grupo → Uma descrição do objetivo do grupo.
Selecione o link Sem membros selecionados em Membros para adicionar membros ao grupo.
Na caixa de diálogo Adicionar membros :
Use a caixa de pesquisa para filtrar a lista de nomes principais na lista.
Selecione as entidades de serviço de aplicativo para desenvolvimento local para este aplicativo. À medida que os objetos são selecionados, eles ficarão acinzentados e serão movidos para a lista Itens selecionados na parte inferior da caixa de diálogo.
Quando terminar, selecione o botão Selecionar .
De volta à página Novo grupo , selecione Criar para criar o grupo.
O grupo será criado e você será levado de volta para a página Todos os grupos . Pode levar até 30 segundos para que o grupo apareça e talvez seja necessário atualizar a página devido ao cache no portal do Azure.
O comando az ad group create é usado para criar grupos no Microsoft Entra ID. Os parâmetros --display-name e --main-nickname são necessários. O nome dado ao grupo deve ser baseado no nome do aplicativo. Também é útil incluir uma frase como 'local-dev' no nome do grupo para indicar o propósito do grupo.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description \<group-description>
Para adicionar membros ao grupo, você precisará da ID do objeto da entidade de serviço do aplicativo, que é diferente da ID do aplicativo. Use a lista az ad sp para listar as entidades de serviço disponíveis. O --filter comando parameter aceita filtros de estilo OData e pode ser usado para filtrar a lista conforme mostrado. O --query parâmetro limita as colunas apenas às de interesse.
az ad sp list \
--filter "startswith(displayName, 'msdocs')" \
--query "[].{objectId:objectId, displayName:displayName}" \
--output table
az ad group member add \
--group \<group-name> \
--member-id \<object-id> \
3 - Atribuir funções à aplicação
Em seguida, você precisa determinar quais funções (permissões) seu aplicativo precisa em quais recursos e atribuir essas funções ao seu aplicativo. Neste exemplo, as funções são atribuídas ao grupo Microsoft Entra criado na etapa 2. As funções podem ser atribuídas a uma função em um recurso, grupo de recursos ou escopo de assinatura. Este exemplo mostra como atribuir funções no escopo do grupo de recursos, já que a maioria dos aplicativos agrupa todos os seus recursos do Azure em um único grupo de recursos.
Localize o grupo de recursos para seu aplicativo pesquisando o nome do grupo de recursos usando a caixa de pesquisa na parte superior do portal do Azure.
Navegue até o grupo de recursos selecionando o nome do grupo de recursos sob o título Grupos de Recursos na caixa de diálogo.
Na página do grupo de recursos, selecione Controle de acesso (IAM) no menu à esquerda.
Na página Controle de acesso (IAM):
Selecione o separador Atribuição de funções.
Selecione + Adicionar no menu superior e, em seguida, Adicionar atribuição de função no menu suspenso resultante.
A página Adicionar atribuição de função lista todas as funções que podem ser atribuídas para o grupo de recursos.
Use a caixa de pesquisa para filtrar a lista para um tamanho mais gerenciável. Este exemplo mostra como filtrar funções de Blob de Armazenamento.
Selecione a função que pretende atribuir.
Selecione Avançar para ir para a próxima tela.
A próxima página Adicionar atribuição de função permite especificar a qual usuário atribuir a função.
Selecione Usuário, grupo ou entidade de serviço em Atribuir acesso a.
Selecione + Selecionar membros em Membros
Uma caixa de diálogo é aberta no lado direito do portal do Azure.
Na caixa de diálogo Selecionar membros:
A caixa de texto Selecionar pode ser usada para filtrar a lista de usuários e grupos em sua assinatura. Se necessário, digite os primeiros caracteres do grupo de desenvolvimento local do Microsoft Entra que você criou para o aplicativo.
Selecione o grupo de desenvolvimento local do Microsoft Entra associado ao seu aplicativo.
Selecione Selecionar na parte inferior da caixa de diálogo para continuar.
O grupo Microsoft Entra é exibido como selecionado na tela Adicionar atribuição de função.
Selecione Rever + atribuir para ir para a página final e, em seguida, Rever + atribuir novamente para concluir o processo.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Por exemplo, para permitir que a entidade de serviço de aplicativo leia, grave e exclua o acesso a contêineres e dados de blob de Armazenamento do Azure a todas as contas de armazenamento no grupo de recursos msdocs-sdk-auth-example , você atribuiria a entidade de serviço de aplicativo à função de Colaborador de Dados de Blob de Armazenamento usando o comando a seguir.
az role assignment create --assignee "aaaaaaaa-bbbb-cccc-7777-888888888888" \
--scope /subscriptions/"Storage Blob Data Subscriber" \
--role "Storage Blob Data Contributor" \
--resource-group "msdocs-sdk-auth-example"
Para obter informações sobre como atribuir permissões no nível de recurso ou assinatura usando a CLI do Azure, consulte o artigo Atribuir funções do Azure usando a CLI do Azure.
4 - Definir variáveis de ambiente de desenvolvimento local
O DefaultAzureCredential objeto procura as informações da entidade de serviço em um conjunto de variáveis de ambiente em tempo de execução. Como a maioria dos desenvolvedores trabalha em vários aplicativos, é recomendável usar um pacote como dotenv para acessar o ambiente a partir de um .env arquivo armazenado no diretório do aplicativo durante o desenvolvimento. Isso define o escopo das variáveis de ambiente usadas para autenticar o aplicativo no Azure de modo que elas só possam ser usadas por esse aplicativo.
O .env arquivo nunca é verificado no controle do código-fonte, pois contém a chave secreta do aplicativo para o Azure. O arquivo .gitignore padrão para JavaScript exclui automaticamente o .env arquivo do check-in.
Para usar o dotenv pacote, primeiro instale o pacote em seu aplicativo.
npm install dotenv
Em seguida, crie um .env arquivo no diretório raiz do aplicativo. Defina os valores das variáveis de ambiente com os valores obtidos do processo de registro do aplicativo da seguinte maneira:
AZURE_CLIENT_ID → O valor da ID do aplicativo.
AZURE_TENANT_ID → O valor de ID do locatário.
AZURE_CLIENT_SECRET → A senha/credencial gerada para o aplicativo.
Finalmente, no código de inicialização do seu aplicativo, use a dotenv biblioteca para ler as variáveis de ambiente do .env arquivo na inicialização.
import 'dotenv/config'
5 - Implementar DefaultAzureCredential em seu aplicativo
Para autenticar objetos de cliente do SDK do Azure no Azure, seu aplicativo deve usar a DefaultAzureCredential@azure/identity classe do pacote. Nesse cenário, DefaultAzureCredential deteta as variáveis AZURE_CLIENT_IDde ambiente , AZURE_TENANT_IDe AZURE_CLIENT_SECRET são definidas e leem essas variáveis para obter as informações da entidade de serviço de aplicativo com as quais se conectar ao Azure.
Em seguida, para qualquer código JavaScript que crie um objeto de cliente do SDK do Azure em seu aplicativo, você deseja:
Importe a DefaultAzureCredential classe do @azure/identity módulo.
Crie um DefaultAzureCredential objeto.
Passe o DefaultAzureCredential objeto para o construtor de objeto de cliente do SDK do Azure.
Um exemplo disso é mostrado no segmento de código a seguir.
// Azure authentication dependency
import { DefaultAzureCredential } from '@azure/identity';
// Azure resource management dependency
import { SubscriptionClient } from "@azure/arm-subscriptions";
// Acquire credential
const tokenCredential = new DefaultAzureCredential();
async function listSubscriptions() {
try {
// use credential to authenticate with Azure SDKs
const client = new SubscriptionClient(tokenCredential);
// get details of each subscription
for await (const item of client.subscriptions.list()) {
const subscriptionDetails = await client.subscriptions.get(
item.subscriptionId
);
/*
Each item looks like:
{
id: '/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e',
subscriptionId: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e',
displayName: 'YOUR-SUBSCRIPTION-NAME',
state: 'Enabled',
subscriptionPolicies: {
locationPlacementId: 'Internal_2014-09-01',
quotaId: 'Internal_2014-09-01',
spendingLimit: 'Off'
},
authorizationSource: 'RoleBased'
},
*/
console.log(subscriptionDetails);
}
} catch (err) {
console.error(JSON.stringify(err));
}
}
listSubscriptions()
.then(() => {
console.log("done");
})
.catch((ex) => {
console.log(ex);
});
DefaultAzureCredential detetará automaticamente o mecanismo de autenticação configurado para o aplicativo e obterá os tokens necessários para autenticar o aplicativo no Azure. Se um aplicativo fizer uso de mais de um cliente SDK, o mesmo objeto de credencial poderá ser usado com cada objeto cliente SDK.