Autenticación de Azure con el módulo De identidad de Azure para Go

En este tutorial, el tipo DefaultAzureCredential del módulo azure Identity for Go se usa para autenticarse en Azure. El módulo Azure Identity ofrece varios tipos de credenciales que se centran en OAuth con el identificador de Entra de Microsoft.

DefaultAzureCredential simplifica la autenticación mediante la combinación de tipos de credenciales usados habitualmente. Encadena los tipos de credenciales que se usan para autenticar aplicaciones implementadas en Azure con tipos de credenciales usados para autenticarse en un entorno de desarrollo.

Requisitos previos

  • Suscripción de Azure: si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

1. Instalación del módulo de identidad de para Go

Ejecute el siguiente comando para descargar el módulo azidentity:

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

2. Autenticación con Azure

Use DefaultAzureCredential para autenticarse en Azure con una de las técnicas siguientes:

Para más información sobre los distintos tipos de credenciales, consulte Tipos de credenciales.

Opción 1: Definición de las variables de entorno

DefaultAzureCredential usa el tipo EnvironmentCredential para configurar la autenticación mediante variables de entorno que admiten tres tipos de autenticación. Elija entre los siguientes tipos de autenticación y defina las variables de entorno adecuadas.

Entidad de servicio con un secreto

Nombre de la variable Valor
AZURE_CLIENT_ID Identificador de aplicación de una entidad de servicio de Azure
AZURE_TENANT_ID Identificador del inquilino de Microsoft Entra de la aplicación
AZURE_CLIENT_SECRET Contraseña de la entidad de servicio de Azure
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

Entidad de servicio con certificado

Nombre de la variable Valor
AZURE_CLIENT_ID Identificador de una aplicación de Microsoft Entra
AZURE_TENANT_ID Identificador del inquilino de Microsoft Entra de la aplicación
AZURE_CLIENT_CERTIFICATE_PATH Ruta de acceso a un archivo de certificado PEM o PKCS12, incluida la clave privada
AZURE_CLIENT_CERTIFICATE_PASSWORD (opcional) Contraseña del archivo de certificado
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

Nombre de usuario y contraseña

Nombre de la variable Valor
AZURE_CLIENT_ID Identificador de una aplicación de Microsoft Entra
AZURE_USERNAME Nombre de usuario (normalmente una dirección de correo electrónico).
AZURE_PASSWORD La contraseña del usuario
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_USERNAME="<azure_username>"
export AZURE_PASSWORD="<azure_user_password>"

La configuración se intenta en el orden anterior. Por ejemplo, si los valores del secreto de cliente y el certificado están presentes, se utiliza el secreto de cliente. Para ver un tutorial completo sobre la autenticación con entidades de servicio, consulte Autenticación de Azure SDK for Go con una entidad de servicio.

Opción 2: Uso de la identidad de carga de trabajo

Id. de carga de trabajo de Microsoft Entra permite que los pods de un clúster de Kubernetes usen una identidad de Kubernetes (cuenta de servicio). Se emite un token de Kubernetes y la federación de OIDC permite que las aplicaciones de Kubernetes accedan a los recursos de Azure de forma segura con el identificador de Microsoft Entra.

Si las variables de entorno necesarias para EnvironmentCredential no están presentes, DefaultAzureCredential intenta autenticarse mediante WorkloadIdentityCredential. WorkloadIdentityCredential intenta leer la configuración de la entidad de servicio de las variables de entorno establecidas por el webhook de identidad de carga de trabajo.

Opción 3: Uso de una identidad administrada

Las identidades administradas eliminan la necesidad de que los desarrolladores administren las credenciales. Al conectarse a recursos que admiten la autenticación de Microsoft Entra, las aplicaciones hospedadas en Azure pueden usar tokens de Microsoft Entra en lugar de credenciales. Las identidades administradas no se admiten en el desarrollo local.

Si las variables de entorno necesarias para WorkloadIdentityCredential no están presentes, DefaultAzureCredential intenta autenticarse mediante ManagedIdentityCredential.

Si usa una identidad administrada asignada por el usuario, ejecute el siguiente comando para establecer la variable de AZURE_CLIENT_ID entorno.

export AZURE_CLIENT_ID="<user_assigned_managed_identity_client_id>"

Si no se establece la AZURE_CLIENT_ID variable de entorno, DefaultAzureCredentials intenta autenticarse mediante la identidad administrada asignada por el sistema si está habilitada en el recurso de hospedaje.

Para ver un tutorial completo sobre la autenticación con identidades administradas en aplicaciones hospedadas en Azure, consulte Autenticación con Azure SDK para Go mediante una identidad administrada.

Opción 4: Iniciar sesión con la CLI de Azure

Para reducir la fricción en el desarrollo local, DefaultAzureCredential puede autenticarse como el usuario que inició sesión en la CLI de Azure.

Ejecute el siguiente comando para iniciar sesión en la CLI de Azure:

az login

Opción 5: Iniciar sesión con la CLI para desarrolladores de Azure

En el desarrollo local, si el usuario no ha iniciado sesión en la CLI de Azure, DefaultAzureCredential puede autenticarse como el usuario que inició sesión en la CLI para desarrolladores de Azure.

Ejecute el siguiente comando para iniciar sesión en la CLI para desarrolladores de Azure:

azd auth login

No se recomienda la autenticación de la CLI para desarrolladores de Azure para aplicaciones que se ejecutan en Azure.

3. Uso de DefaultAzureCredential para autenticar ResourceClient

Cree un nuevo módulo de Go de ejemplo denominado azure-auth para probar la autenticación en Azure con DefaultAzureCredential:

  1. Cree un directorio para probar y ejecutar el código de Go de ejemplo y, a continuación, cambie a ese directorio.

  2. Ejecute go mod init para crear un módulo:

    go mod init azure-auth
    
  3. Ejecute go para descargar, compilar e instalar los módulos necesarios del SDK de Azure para Go:

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    
  4. Cree un archivo denominado main.go e inserte el siguiente código:

    package main
    
    import (
      "context"
    
      "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
      "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    )
    
    const subscriptionID = "<subscription ID>"
    
    func main() {
      cred, err := azidentity.NewDefaultAzureCredential(nil)
      if err != nil {
        // TODO: handle error
      }
      // Azure SDK Resource Management clients accept the credential as a parameter.
      // The client will authenticate with the credential as necessary.
      client, err := armsubscription.NewSubscriptionsClient(cred, nil)
      if err != nil {
        // TODO: handle error
      }
      _, err = client.Get(context.TODO(), subscriptionID, nil)
      if err != nil {
        // TODO: handle error
      }
    }   
    
    

    Reemplace <subscription ID> con el Id. de suscripción.

  5. Ejecute go run para compilar y ejecutar la aplicación:

    go run .
    

    Nota:

    Para ejecutarse tal como está en el sistema local, debe iniciar sesión en Azure mediante la CLI de Azure o la CLI para desarrolladores de Azure.

Autenticación en Azure con DefaultAzureCredential

Use el código siguiente de la aplicación para autenticarse en Azure con el módulo Azure Identity mediante DefaultAzureCredential:

// This credential type checks environment variables for configuration.
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
  // handle error
}

// Azure Resource Management clients accept the credential as a parameter
client, err := armresources.NewClient("<subscriptionId>", cred, nil)
if err != nil {
  // handle error
}

Solución de problemas

Para obtener instrucciones sobre cómo resolver errores de tipos de credenciales específicos, consulte la guía de solución de problemas.

Pasos siguientes