Autenticación de aplicaciones JavaScript en servicios de Azure durante el desarrollo local mediante entidades de servicio

Al crear aplicaciones en la nube, los desarrolladores deben depurar y probar aplicaciones en su estación de trabajo local. Cuando se ejecuta una aplicación en la estación de trabajo de un desarrollador durante el desarrollo local, esta debe autenticarse en los servicios de Azure que usa. En este artículo se explica cómo configurar objetos de entidad de servicio de aplicación dedicados que se usarán durante el desarrollo local.

Diagrama que muestra cómo una aplicación de JavaScript durante el desarrollo local usa las credenciales del desarrollador para conectarse a Azure mediante la obtención de esas credenciales instaladas localmente herramientas de desarrollo.

Las entidades de servicio de aplicaciones dedicadas para el desarrollo local permiten seguir el principio de privilegios mínimos durante el desarrollo de aplicaciones. Dado que los permisos tienen como ámbito exactamente lo que se necesita para la aplicación durante el desarrollo, se impide que el código de la aplicación acceda accidentalmente a un recurso de Azure destinado al uso por otra aplicación. Este método también impide que se produzcan errores cuando la aplicación se mueve a producción porque la aplicación se ha sobreprivilegado en el entorno de desarrollo.

Cuando la aplicación se registra en Azure, se configura una entidad de servicio de aplicación. Al registrar aplicaciones para el desarrollo local, se recomienda lo siguiente:

  • Crear registros de aplicaciones independientes para cada desarrollador que trabaje en la aplicación. Este método crea entidades de servicio de aplicación independientes para que cada desarrollador las use durante el desarrollo local y evite la necesidad de que los desarrolladores compartan credenciales para una sola entidad de servicio de aplicación.
  • Crear registros de aplicaciones independientes por cada aplicación. Esto limita los permisos de la aplicación solo a lo que necesita la aplicación.

Durante el desarrollo local, las variables de entorno se establecen con la identidad de la entidad de servicio de la aplicación. El SDK de Azure para JavaScript lee estas variables de entorno y usa esta información para autenticar la aplicación en los recursos de Azure que necesita.

1: Registro de la aplicación en Azure

Los objetos de la entidad de servicio de la aplicación se crean con un registro de aplicación en Azure. Puede crear entidades de servicio mediante Azure Portal o la CLI de Azure.

Inicie sesión en Azure Portal y siga los pasos siguientes.

Instrucciones Instantánea
En el Portal de Azure:
  1. Escriba registros de aplicación en la barra de búsqueda de la parte superior de Azure Portal.
  2. Seleccione el elemento con la etiqueta Registros de aplicaciones en el encabezado Servicios, en el menú que aparece bajo la barra de búsqueda.
Captura de pantalla que muestra cómo usar la barra de búsqueda de la parte superior en Azure Portal para localizar la página Registros de aplicaciones y navegar hasta ella.
En la página Registros de aplicaciones, seleccione + Nuevo registro. Captura de pantalla que muestra la ubicación del botón Nuevo registro en la página Registros de aplicaciones.
En la página Registrar una aplicación, rellene el formulario como se indica a continuación.
  1. Nombre → Escriba un nombre para el registro de la aplicación en Azure. Se recomienda que este nombre incluya el nombre de la aplicación, el usuario para el que se realizará el registro de la aplicación y un identificador, como, por ejemplo, "dev", para indicar que este registro de aplicación es para su uso en el desarrollo local.
  2. Tipos de cuenta admitidosSolo las cuentas de este directorio organizativo.
Seleccione Registrar para registrar la aplicación y crear la entidad de servicio de la aplicación.
Captura de pantalla que muestra cómo rellenar la página de registro de una aplicación al proporcionar un nombre a la aplicación y especificar tipos de cuenta compatibles como cuentas solo en este directorio organizativo.
En la página Registro de aplicaciones de la aplicación:
  1. Id. de aplicación (cliente) → Este es el identificador de aplicación que usará la aplicación para acceder a Azure durante el desarrollo local. Copie este valor en una ubicación temporal en un editor de texto, ya que lo necesitará en un paso futuro.
  2. Id. de directorio (inquilino) → La aplicación también necesitará este valor cuando se autentique en Azure. Copie este valor en una ubicación temporal en un editor de texto, ya que también lo necesitará en un paso futuro.
  3. Credenciales de cliente → Debe establecer las credenciales de cliente para la aplicación antes de que la aplicación pueda autenticarse en Azure y usar los servicios de Azure. Seleccione Agregar un certificado o un secreto para agregar credenciales para la aplicación.
Captura de pantalla después de que el registro de la aplicación se haya completado con la ubicación del identificador de la aplicación, el identificador de inquilino.
En la página Certificados y secretos, seleccione + Nuevo secreto de cliente. Captura de pantalla que muestra la ubicación del vínculo que debe usarse para crear un nuevo secreto de cliente en la página de certificados y secretos.
Aparecerá el cuadro de diálogo Agregar un secreto de cliente desde el lado derecho de la página. En este cuadro de diálogo:
  1. Descripción → Escriba un valor de Actual.
  2. Expira → Seleccione un valor de 24 meses.
Seleccione Agregar para agregar el secreto.
Captura de pantalla que muestra la página a la que se agrega el nuevo secreto de cliente para la entidad de servicio que creó el proceso de registro de la aplicación.
En la página Certificados y secretos , se le mostrará el valor del secreto de cliente.

Copie este valor en una ubicación temporal en un editor de texto, ya que lo necesitará en un paso futuro.

IMPORTANTE: Esta es la única vez que verá este valor. Una vez que deje o actualice esta página, no podrá volver a ver este valor. Puede agregar más secretos de cliente sin invalidar este secreto de cliente, pero no volverá a ver este valor.
Captura de pantalla que muestra la página con el secreto de cliente generado.

2- Creación de un grupo de seguridad de Microsoft Entra para el desarrollo local

Dado que normalmente hay varios desarrolladores que trabajan en una aplicación, se recomienda crear un grupo de Microsoft Entra para encapsular los roles (permisos) que la aplicación necesita en el desarrollo local en lugar de asignar los roles a objetos de entidad de servicio individuales. Esto ofrece las ventajas que se indican a continuación.

  • Todos los desarrolladores están seguros de tener asignados los mismos roles, ya que los roles se asignan en el nivel de grupo.
  • Si se necesita un nuevo rol para la aplicación, solo debe agregarse al grupo De Microsoft Entra para la aplicación.
  • Si un nuevo desarrollador se une al equipo, se crea una nueva entidad de servicio de aplicación para el desarrollador y esta se agrega al grupo, lo que garantiza que el desarrollador tiene los permisos adecuados para trabajar en la aplicación.
Instrucciones Instantánea
Vaya a la página Microsoft Entra ID (Id. de Entra de Microsoft) en Azure Portal; para ello, escriba Microsoft Entra ID en el cuadro de búsqueda de la parte superior de la página y, a continuación, seleccione Microsoft Entra ID en los servicios. Captura de pantalla en la que se muestra cómo usar la barra de búsqueda superior de Azure Portal para buscar y navegar a la página De id. de Microsoft Entra.
En la página Microsoft Entra ID (Id. de Entra de Microsoft), seleccione Grupos en el menú de la izquierda. Captura de pantalla que muestra la ubicación del elemento de menú Grupos en el menú izquierdo de la página Directorio predeterminado de Id. de Microsoft Entra.
En la página Todos los grupos, seleccione Nuevo grupo. Captura de pantalla que muestra la ubicación del botón Nuevo grupo en la página Todos los grupos.
En la página Nuevo grupo:
  1. Tipo de grupo: Seguridad
  2. Nombre de grupo → Nombre del grupo de seguridad, que normalmente se crea a partir del nombre de la aplicación. También resulta útil incluir una cadena como local-dev en el nombre del grupo para indicar el propósito del grupo.
  3. Descripción del grupo → Descripción del propósito del grupo.
  4. Seleccione el vínculo Sin miembros seleccionados en Miembros para agregar miembros al grupo.
Captura de pantalla que muestra cómo crear un nuevo grupo de Microsoft Entra para la aplicación.
En el cuadro de diálogo Agregar miembros:
  1. Use el cuadro de búsqueda para filtrar la lista de entidades de seguridad en la lista.
  2. Seleccione las entidades de servicio de la aplicación para el desarrollo local de esta aplicación. A medida que se seleccionan los objetos, se atenuarán y se moverán a la lista Elementos seleccionados de la parte inferior del cuadro de diálogo.
  3. Cuando haya terminado, pulse el botón Seleccionar.
Captura de pantalla del cuadro de diálogo Agregar miembros que muestra cómo seleccionar las entidades de servicio de la aplicación que se deben incluir en el grupo.
De nuevo en la página Nuevo grupo, seleccione Crear para crear el grupo.

El grupo se creará y volverá a la página Todos los grupos. El grupo puede tardar hasta 30 segundos en aparecer y es posible que tenga que actualizar la página debido al almacenamiento en caché en Azure Portal.
Captura de pantalla de la página Nuevo grupo que muestra cómo completar el proceso con la selección del botón Crear.

3: Asignación de roles a la aplicación

A continuación, debe determinar qué roles (permisos) necesita la aplicación y en qué recursos para, a continuación, asignar dichos roles a la aplicación. En este ejemplo, los roles se asignan al grupo Microsoft Entra creado en el paso 2. Los roles se pueden asignar a un rol en el ámbito de recurso, grupo de recursos o suscripción. En este ejemplo se muestra cómo asignar roles en el ámbito del grupo de recursos, ya que la mayoría de las aplicaciones agrupan todos sus recursos de Azure en un único grupo de recursos.

Instrucciones Instantánea
Busque el grupo de recursos de la aplicación; para ello, busque el nombre del grupo de recursos mediante el cuadro de búsqueda situado en la parte superior de Azure Portal.

Vaya al grupo de recursos. Para ello, seleccione el nombre del grupo de recursos en el encabezado Grupos de recursos del cuadro de diálogo.
Captura de pantalla que muestra cómo usar el cuadro de búsqueda de la parte superior de Azure Portal para localizar el grupo de recursos al que desea asignar roles (permisos) y navegar hasta él.
En la página del grupo de recursos, seleccione Control de acceso (IAM) en el menú izquierdo. Captura de pantalla de la página del grupo de recursos que muestra la ubicación del elemento de menú de Control de acceso (IAM).
En la página Control de acceso (IAM):
  1. Seleccione la pestaña Asignaciones de roles.
  2. Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.
Captura de pantalla que muestra cómo navegar hasta la pestaña de asignación de roles junto con la ubicación del botón usado para agregar asignaciones de roles a un grupo de recursos.
La página Agregar asignación de roles muestra todos los roles que se pueden asignar para el grupo de recursos.
  1. Use el cuadro de búsqueda para filtrar la lista a un tamaño más fácil de administrar. En este ejemplo se muestra cómo filtrar los roles de Storage Blob.
  2. Seleccione el rol que quiere asignar.
    Seleccione Siguiente para ir a la pantalla siguiente.
Captura de pantalla que muestra cómo filtrar y seleccionar las asignaciones de roles que deben agregarse al grupo de recursos.
La siguiente página Agregar asignación de roles permite especificar a qué usuario se debe asignar el rol.
  1. Seleccione Usuario, grupo o entidad de servicio en Asignar acceso a.
  2. Seleccione + Seleccionar miembros en Miembros.
Se abre un cuadro de diálogo en el lado derecho de Azure Portal.
Captura de pantalla que muestra el botón de radio para seleccionar asignar un rol a un grupo de Microsoft Entra y el vínculo usado para seleccionar el grupo al que asignar el rol.
En el cuadro de diálogo Seleccionar miembros:
  1. El cuadro de texto Seleccionar se puede usar para filtrar la lista de usuarios y grupos de la suscripción. Si es necesario, escriba los primeros caracteres del grupo de Desarrollo local de Microsoft Entra que creó para la aplicación.
  2. Seleccione el grupo microsoft Entra de desarrollo local asociado a la aplicación.
Seleccione Seleccionar en la parte inferior del cuadro de diálogo para continuar.
Captura de pantalla que muestra cómo filtrar y seleccionar el grupo Microsoft Entra para la aplicación en el cuadro de diálogo Seleccionar miembros.
El grupo Microsoft Entra se muestra como seleccionado en la pantalla Agregar asignación de roles.

Seleccione Revisar y asignar para ir a la página final y, a continuación, Revisar y asignar de nuevo para completar el proceso.
Captura de pantalla que muestra la página Agregar asignación de roles completada y la ubicación del botón Revisar y asignar que se usa para completar el proceso.

4- Establecimiento de variables de entorno de desarrollo local

El DefaultAzureCredential objeto busca la información de la entidad de servicio en un conjunto de variables de entorno en tiempo de ejecución. Dado que la mayoría de los desarrolladores trabajan en varias aplicaciones, se recomienda usar un paquete como dotenv para acceder al entorno desde un .env archivo almacenado en el directorio de la aplicación durante el desarrollo. Esto limita las variables de entorno que se usan para autenticar la aplicación en Azure de modo que esta aplicación solo las pueda usar.

El .env archivo nunca está protegido en el control de código fuente, ya que contiene la clave secreta de aplicación para Azure. El archivo .gitignore estándar para JavaScript excluye automáticamente el .env archivo de check-in.

Para usar el dotenv paquete, instale primero el paquete en la aplicación.

npm install dotenv

A continuación, cree un .env archivo en el directorio raíz de la aplicación. Establezca los valores de las variables de entorno con los valores obtenidos del proceso de registro de aplicaciones de la siguiente manera:

  • AZURE_CLIENT_ID → Valor del id. de la aplicación.
  • AZURE_TENANT_ID → Valor del id. de inquilino.
  • AZURE_CLIENT_SECRET → Contraseña o credencial generada para la aplicación.
AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz

Por último, en el código de inicio de la aplicación, use la dotenv biblioteca para leer las variables de entorno del .env archivo al iniciarse.

import 'dotenv/config'

5: Implementación de DefaultAzureCredential en la aplicación

Para autenticar objetos de cliente del SDK de Azure en Azure, la aplicación debe usar la DefaultAzureCredential clase del @azure/identity paquete. En este escenario, DefaultAzureCredential detecta las variables AZURE_CLIENT_IDde entorno , AZURE_TENANT_IDy se establecen y AZURE_CLIENT_SECRET leen esas variables para obtener la información de la entidad de servicio de la aplicación con la que conectarse a Azure.

Empiece agregando el paquete @azure/identity a la aplicación.

npm install @azure/identity

A continuación, para cualquier código javaScript que cree un objeto de cliente del SDK de Azure en la aplicación, querrá:

  1. Importe la DefaultAzureCredential clase desde el @azure/identity módulo.
  2. Crear un objeto DefaultAzureCredential.
  3. Pase el DefaultAzureCredential objeto al constructor de objetos de cliente del SDK de Azure.

En el segmento de código siguiente se muestra un ejemplo de esto.

// 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/123456',
          subscriptionId: '123456',
          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 detectará automáticamente el mecanismo de autenticación configurado para la aplicación y obtendrá los tokens necesarios para autenticar la aplicación en Azure. Si una aplicación usa más de un cliente del SDK, se puede usar el mismo objeto de credencial con cada objeto cliente del SDK.