Partilhar via


Autenticar aplicativos Go para serviços do Azure durante o desenvolvimento local usando contas de desenvolvedor

Quando os desenvolvedores criam aplicativos na nuvem, eles normalmente depuram e testam aplicativos em sua estação de trabalho local. 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 usar as credenciais do Azure de um desenvolvedor para autenticar o aplicativo no Azure durante o desenvolvimento local.

Um diagrama mostrando como um aplicativo Go durante o desenvolvimento local usa as credenciais do desenvolvedor para se conectar ao Azure obtendo essas credenciais de ferramentas de desenvolvimento instaladas localmente.

Para que um aplicativo se autentique no Azure durante o desenvolvimento local usando as credenciais do Azure do desenvolvedor, um desenvolvedor deve estar conectado ao Azure a partir da CLI do Azure ou da CLI do Azure Developer. O SDK do Azure para Go é capaz de detetar que o desenvolvedor está conectado a partir de uma dessas ferramentas e, em seguida, obter as credenciais necessárias do cache de credenciais para autenticar o aplicativo no Azure como o usuário conectado.

Essa abordagem é mais fácil de configurar para uma equipe de desenvolvimento, pois aproveita as contas existentes do Azure dos desenvolvedores. No entanto, a conta de um desenvolvedor provavelmente terá mais permissões do que as exigidas pelo aplicativo, excedendo assim as permissões com as quais o aplicativo será executado em produção. Como alternativa, podes criar principais de serviço de aplicação para usar durante o desenvolvimento local, que podem ter apenas o acesso necessário para a aplicação.

1 - Criar grupo de segurança Microsoft Entra para desenvolvimento local

Como quase sempre há vários desenvolvedores que trabalham em um aplicativo, é recomendável primeiro criar um grupo de segurança do Microsoft Entra para encapsular as funções (permissões) de que o aplicativo precisa no desenvolvimento local. Esta abordagem 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 se juntar à equipe, ele simplesmente deve ser adicionado ao grupo correto do Microsoft Entra para obter as permissões corretas para trabalhar no aplicativo.

Se você tiver um grupo de segurança do Microsoft Entra existente para sua equipe de desenvolvimento, poderá usar esse grupo. Caso contrário, conclua as etapas a seguir para criar um grupo de segurança do Microsoft Entra.

O comando az ad group create é utilizado 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>"

Copie o valor da propriedade id na saída do comando. Este é o ID do objeto para o grupo. Você precisa dele em etapas posteriores. Você também pode usar o comando az ad group show para obter essa propriedade.

Para adicionar membros ao grupo, você precisa da ID do objeto do usuário do Azure. Use o az ad user list para listar as entidades de serviço disponíveis. O comando --filter parameter aceita filtros de estilo OData e pode ser usado para filtrar a lista no nome de exibição do usuário, conforme mostrado. O parâmetro --query limita a saída a colunas de interesse.

az ad user list \
    --filter "startswith(displayName, 'Bob')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

O comando az ad group member add pode ser usado para adicionar membros a grupos.

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

Observação

Por padrão, a criação de grupos de segurança do Microsoft Entra é limitada a determinadas funções privilegiadas em um diretório. Se não conseguir criar um grupo, contacte um administrador do seu diretório. Se não conseguir adicionar membros a um grupo existente, contacte o proprietário do grupo ou um administrador de diretório. Para saber mais, consulte Gerir grupos do Microsoft Entra e associação a grupos.

2 - Atribuir funções ao grupo Microsoft Entra

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 serão atribuídas ao grupo Microsoft Entra criado na etapa 1. As funções podem ser atribuídas 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.

Um utilizador, grupo ou principal de serviço da aplicação recebe uma função no Azure usando o comando az role assignment create. Você pode especificar um grupo com sua ID de objeto.

az role assignment create --assignee <objectId> \
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
    --role "<roleName>" 

Para obter os nomes de função que podem ser atribuídos, use o comando az role definition list.

az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table

Por exemplo, para permitir que os membros de um grupo com uma ID de objeto de leiam, gravem e excluam o acesso a contêineres e dados de blob de Armazenamento do Azure em todas as contas de armazenamento no grupo de recursos de msdocs-go-sdk-auth-example na assinatura com ID , você atribuiria a função de Colaborador de Dados de Blob de Armazenamento ao grupo usando o comando a seguir.

az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-go-sdk-auth-example \
    --role "Storage Blob Data Contributor"

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.

3 - Entrar no Azure usando a CLI do Azure ou a CLI do Desenvolvedor do Azure

Abra um terminal na estação de trabalho do desenvolvedor e inicie sessão no Azure a partir da CLI do Azure .

az login

4 - Implementar DefaultAzureCredential em seu aplicativo

Para autenticar objetos de cliente do SDK do Azure no Azure, seu aplicativo deve usar a classe DefaultAzureCredential. Nesse cenário, DefaultAzureCredential verificará sequencialmente se o desenvolvedor entrou no Azure usando a CLI do Azure ou a CLI do desenvolvedor do Azure. Se o desenvolvedor estiver conectado ao Azure usando uma dessas ferramentas, as credenciais usadas para entrar na ferramenta serão usadas pelo aplicativo para autenticar no Azure.

Primeiro, adicione o pacote azidentity ao seu aplicativo.

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

Em seguida, para qualquer código Go que crie um objeto de cliente do SDK do Azure em seu aplicativo, você deseja:

  1. Importe o pacote azidentity.
  2. Crie uma instância do tipo DefaultAzureCredential.
  3. Passe a instância do tipo DefaultAzureCredential para o construtor do cliente do SDK do Azure.

Um exemplo dessas etapas é mostrado no segmento de código a seguir.

import (
	"context"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

const (
	account       = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
	containerName = "sample-container"
	blobName      = "sample-blob"
	sampleFile    = "path/to/sample/file"
)

func main() {
    // create a credential
    cred, err := azidentity.NewDefaultAzureCredential(nil)
    if err != nil {
      // TODO: handle error
    }
    
    // create a client for the specified storage account
    client, err := azblob.NewClient(account, cred, nil)
    if err != nil {
      // TODO: handle error
    }
    
    // TODO: perform some action with the azblob Client
    // _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}