Compartir a través de


Inicio rápido: Biblioteca cliente de secreto de Azure Key Vault para JavaScript

Introducción a la biblioteca cliente de secretos de Azure Key Vault para JavaScript. Azure Key Vault es un servicio en la nube que ofrece el almacenamiento seguro de los secretos. Puede almacenar de forma segura claves, contraseñas, certificados y otros secretos. Las instancias de Azure Key Vault se pueden crear y administrar a través de Azure Portal. En este inicio rápido, aprenderá a crear, recuperar y eliminar secretos de una instancia de Azure Key Vault mediante la biblioteca cliente de JavaScript.

Recursos de la biblioteca cliente de Key Vault:

Documentación de referencia de la API | Código fuente de la biblioteca | Paquete (npm)

Para más información sobre Key Vault y los secretos, consulte:

Prerrequisitos

Requisitos previos

En este inicio rápido se supone que ejecuta la CLI de Azure.

Inicio de sesión en Azure

  1. Ejecute el comando login.

    az login
    

    Si la CLI puede abrir el explorador predeterminado, lo hará y cargará una página de inicio de sesión de Azure.

    En caso contrario, abra una página del explorador en https://aka.ms/devicelogin y escriba el código de autorización que se muestra en el terminal.

  2. Inicie sesión con las credenciales de su cuenta en el explorador.

Creación de un grupo de recursos y de un almacén de claves

  1. Uso del comando az group create para crear un grupo de recursos:

    az group create --name myResourceGroup --location eastus
    

    Si lo prefiere, puede cambiar "eastus" a una ubicación más próxima.

  2. Use az keyvault create para crear el almacén de claves:

    az keyvault create --name <your-unique-keyvault-name> --resource-group myResourceGroup
    

    Reemplace <your-unique-keyvault-name> por un nombre que sea único en todo Azure. Normalmente, se usa el nombre personal o de la empresa, junto con otros números e identificadores.

Concesión de acceso al almacén de claves

Para obtener permisos para el almacén de claves mediante Control de acceso basado en roles (RBAC), asigne un rol a su "Nombre principal de usuario" (UPN) mediante el comando de la CLI de Azure az role assignment create.

az role assignment create --role "Key Vault Secrets Officer" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"

Reemplace <upn>, <subscription-id>, <resource-group-name> y <your-unique-keyvault-name> por los valores reales. El UPN normalmente tendrá el formato de una dirección de correo electrónico (por ejemplo, username@domain.com).

Creación de una aplicación de Node.js

Cree una aplicación Node.js que use el almacén de claves.

  1. En un terminal, cree una carpeta con el nombre key-vault-node-app y cámbiela a esa carpeta:

    mkdir key-vault-node-app && cd key-vault-node-app
    
  2. Inicialice el proyecto de Node.js:

    npm init -y
    

Instalación de paquetes de Key Vault

  1. Con el terminal, instale la biblioteca cliente de secretos de Azure Key Vault, @azure/keyvault-secrets para Node.js.

    npm install @azure/keyvault-secrets
    
  2. Instale la biblioteca cliente de identidades de Azure, @azure/identity para autenticarse en un almacén de claves.

    npm install @azure/identity
    

Concesión de acceso al almacén de claves

Para obtener permisos para el almacén de claves mediante Control de acceso basado en roles (RBAC), asigne un rol a su "Nombre principal de usuario" (UPN) mediante el comando de la CLI de Azure az role assignment create.

az role assignment create --role "Key Vault Secrets Officer" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"

Reemplace <upn>, <subscription-id>, <resource-group-name> y <your-unique-keyvault-name> por los valores reales. El UPN normalmente tendrá el formato de una dirección de correo electrónico (por ejemplo, username@domain.com).

Establecimiento de variables de entorno

Esta aplicación también usa el punto de conexión del almacén de claves como variable de entorno llamada KEY_VAULT_URL.

set KEY_VAULT_URL=<your-key-vault-endpoint>

Autenticación y creación de un cliente

Deben autorizarse las solicitudes de aplicación a la mayor parte de servicios de Azure. El uso del método DefaultAzureCredential que proporciona la biblioteca cliente de Azure Identity es el enfoque recomendado para implementar conexiones sin contraseña a los servicios de Azure en el código. DefaultAzureCredential admite varios métodos de autenticación y determina el que se debe usar en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos (local frente a producción) sin implementar código específico del entorno.

En este inicio rápido, DefaultAzureCredential se autentica en el almacén de claves mediante las credenciales del usuario de desarrollo local que inició sesión en la CLI de Azure. Cuando la aplicación se implementa en Azure, el mismo código DefaultAzureCredential puede detectar y usar automáticamente una identidad administrada asignada a una instancia de App Service, máquina virtual u otros servicios. Para más información, consulte Introducción a la identidad administrada.

En este código, el punto de conexión del almacén de claves se usa para crear el cliente del almacén de claves. El formato del punto de conexión es similar a https://<your-key-vault-name>.vault.azure.net, pero puede cambiar para nubes soberanas. Para más información sobre la autenticación en el almacén de claves, consulte la Guía del desarrollador.

Ejemplo de código

Los ejemplos de código siguientes le mostrarán cómo crear un cliente y cómo establecer, recuperar y eliminar un secreto.

Este código usa las siguientes clases y métodos secretos de Key Vault:

Instalación del marco de la aplicación

  • Cree un nuevo archivo de texto y pegue el siguiente código en el archivo index.js.

    const { SecretClient } = require("@azure/keyvault-secrets");
    const { DefaultAzureCredential } = require("@azure/identity");
    
    async function main() {
      // If you're using MSI, DefaultAzureCredential should "just work".
      // Otherwise, DefaultAzureCredential expects the following three environment variables:
      // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory
      // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant
      // - AZURE_CLIENT_SECRET: The client secret for the registered application
      const credential = new DefaultAzureCredential();
    
      const keyVaultUrl = process.env["KEY_VAULT_URL"];
      if(!keyVaultUrl) throw new Error("KEY_VAULT_URL is empty");
    
      const client = new SecretClient(keyVaultUrl, credential);
    
      // Create a secret
      // The secret can be a string of any kind. For example,
      // a multiline text block such as an RSA private key with newline characters,
      // or a stringified JSON object, like `JSON.stringify({ mySecret: 'MySecretValue'})`.
      const uniqueString = new Date().getTime();
      const secretName = `secret${uniqueString}`;
      const result = await client.setSecret(secretName, "MySecretValue");
      console.log("result: ", result);
    
      // Read the secret we created
      const secret = await client.getSecret(secretName);
      console.log("secret: ", secret);
    
      // Update the secret with different attributes
      const updatedSecret = await client.updateSecretProperties(secretName, result.properties.version, {
        enabled: false
      });
      console.log("updated secret: ", updatedSecret);
    
      // Delete the secret immediately without ability to restore or purge.
      await client.beginDeleteSecret(secretName);
    }
    
    main().catch((error) => {
      console.error("An error occurred:", error);
      process.exit(1);
    });
    

Ejecutar la aplicación de ejemplo

  1. Ejecute la aplicación:

    node index.js
    
  2. Los métodos crear y obtener devuelven un objeto JSON completo para el secreto:

    {
        "value": "MySecretValue",
        "name": "secret1637692472606",
        "properties": {
            "createdOn": "2021-11-23T18:34:33.000Z",
            "updatedOn": "2021-11-23T18:34:33.000Z",
            "enabled": true,
            "recoverableDays": 90,
            "recoveryLevel": "Recoverable+Purgeable",
            "id": "https: //YOUR-KEYVAULT-ENDPOINT.vault.azure.net/secrets/secret1637692472606/YOUR-VERSION",
            "vaultUrl": "https: //YOUR-KEYVAULT-ENDPOINT.vault.azure.net",
            "version": "YOUR-VERSION",
            "name": "secret1637692472606"
        }
    }
    

    El método de actualización devuelve los pares de nombre y valores de propiedades:

    "createdOn": "2021-11-23T18:34:33.000Z",
    "updatedOn": "2021-11-23T18:34:33.000Z",
    "enabled": true,
    "recoverableDays": 90,
    "recoveryLevel": "Recoverable+Purgeable",
    "id": "https: //YOUR-KEYVAULT-ENDPOINT/secrets/secret1637692472606/YOUR-VERSION",
    "vaultUrl": "https: //YOUR-KEYVAULT-ENDPOINT",
    "version": "YOUR-VERSION",
    "name": "secret1637692472606"
    
  • Cree un nuevo archivo de texto y pegue el siguiente código en el archivo index.ts.

    import {
      SecretClient,
      KeyVaultSecret,
      SecretProperties,
    } from "@azure/keyvault-secrets";
    import { DefaultAzureCredential } from "@azure/identity";
    import "dotenv/config";
    
    // Passwordless credential
    const credential = new DefaultAzureCredential();
    
    // Get Key Vault name from environment variables
    // such as `https://${keyVaultName}.vault.azure.net`
    const keyVaultUrl = process.env.KEY_VAULT_URL;
    if (!keyVaultUrl) throw new Error("KEY_VAULT_URL is empty");
    
    function printSecret(secret: KeyVaultSecret): void {
      const { name, value, properties } = secret;
      const { enabled, expiresOn, createdOn } = properties;
      console.log("Secret: ", { name, value, enabled, expiresOn, createdOn });
    }
    function printSecretProperties(secret: SecretProperties): void {
      const { name, enabled, expiresOn, createdOn } = secret;
      console.log("Secret: ", { name, enabled, expiresOn, createdOn });
    }
    
    async function main(): Promise<void> {
      // Create a new SecretClient
      const client = new SecretClient(keyVaultUrl, credential);
    
      // Create a unique secret name
      const uniqueString = new Date().getTime().toString();
      const secretName = `secret${uniqueString}`;
    
      // Create a secret
      const createSecretResult = await client.setSecret(
        secretName,
        "MySecretValue"
      );
      printSecret(createSecretResult);
    
      // Get the secret by name
      const getSecretResult = await client.getSecret(secretName);
      printSecret(getSecretResult);
    
      // Update properties
      const updatedSecret = await client.updateSecretProperties(
        secretName,
        getSecretResult.properties.version,
        {
          enabled: false,
        }
      );
      printSecretProperties(updatedSecret);
    
      // Delete secret (without immediate purge)
      const deletePoller = await client.beginDeleteSecret(secretName);
      await deletePoller.pollUntilDone();
    }
    
    main().catch((error) => {
      console.error("An error occurred:", error);
      process.exit(1);
    });
    

Ejecutar la aplicación de ejemplo

  1. Compilar la aplicación TypeScript:

    tsc
    
  2. Ejecute la aplicación:

    node index.js
    
  3. Los métodos crear y obtener devuelven un objeto JSON completo para el secreto:

    {
        "value": "MySecretValue",
        "name": "secret1637692472606",
        "properties": {
            "createdOn": "2021-11-23T18:34:33.000Z",
            "updatedOn": "2021-11-23T18:34:33.000Z",
            "enabled": true,
            "recoverableDays": 90,
            "recoveryLevel": "Recoverable+Purgeable",
            "id": "https: //YOUR-KEYVAULT-ENDPOINT.vault.azure.net/secrets/secret1637692472606/YOUR-VERSION",
            "vaultUrl": "https: //YOUR-KEYVAULT-ENDPOINT.vault.azure.net",
            "version": "YOUR-VERSION",
            "name": "secret1637692472606"
        }
    }
    

    El método de actualización devuelve los pares de nombre y valores de propiedades:

    "createdOn": "2021-11-23T18:34:33.000Z",
    "updatedOn": "2021-11-23T18:34:33.000Z",
    "enabled": true,
    "recoverableDays": 90,
    "recoveryLevel": "Recoverable+Purgeable",
    "id": "https: //YOUR-KEYVAULT-ENDPOINT/secrets/secret1637692472606/YOUR-VERSION",
    "vaultUrl": "https: //YOUR-KEYVAULT-ENDPOINT",
    "version": "YOUR-VERSION",
    "name": "secret1637692472606"
    

Integración con App Configuration

El SDK de Azure proporciona un método auxiliar, parseKeyVaultSecretIdentifier, para analizar el identificador de secreto de Key Vault determinado. Esto es necesario si usa referencias de App Configuration en Key Vault. App Config almacena el id. de secreto de Key Vault. Necesita el método parseKeyVaultSecretIdentifier para analizar ese identificador para obtener el nombre secreto. Una vez que tenga el nombre secreto, puede obtener el valor secreto actual con código de esta guía de inicio rápido.

Pasos siguientes

En este inicio rápido, ha creado un almacén de claves, ha almacenado un secreto en él y, posteriormente, lo ha recuperado. Para más información sobre Key Vault y cómo integrarlo con las aplicaciones, continúe con los artículos siguientes.