Compartir vía


Creación y uso de tokens de SAS de cuenta con Azure Blob Storage y JavaScript

En este artículo se muestra cómo crear y usar un token de SAS de cuenta en la biblioteca cliente de Azure Blob Storage v12 para JavaScript. Una vez conectado, el código puede funcionar en contenedores, blobs y características del servicio Blob Storage.

Los fragmentos de código de ejemplo están disponibles en GitHub como archivos de Node.js ejecutables.

Paquete (npm) | Ejemplos | Referencia de la API | Código fuente de la biblioteca | Hacer comentarios

Tokens de SAS de cuenta

Un token de SAS de cuenta es un tipo de token de SAS para la delegación de acceso proporcionado por Azure Storage. Los tokens de SAS de cuenta proporcionan acceso a Azure Storage. El token será lo restrictivo que lo defina durante su creación. Dado que cualquier persona con el token puede usarlo para acceder a la cuenta de Storage, debe definirlo con los permisos más restrictivos que permitan que el token complete las tareas necesarias.

Los procedimientos recomendados para la creación de tokens incluyen la limitación de los permisos:

  • Servicios: Blob, File, Queue, Table
  • Tipos de recursos: servicio, contenedor u objeto
  • Permisos como para crear, leer, escribir, actualizar y eliminar

Incorporación de las dependencias necesarias a la aplicación

Incluya las dependencias necesarias para crear un token de SAS de cuenta.

const { 
    BlobServiceClient, 
    generateAccountSASQueryParameters, 
    AccountSASPermissions, 
    AccountSASServices,
    AccountSASResourceTypes,
    StorageSharedKeyCredential,
    SASProtocol 
} = require('@azure/storage-blob');
require('dotenv').config()

Obtención de las variables de entorno para crear credenciales de clave compartida

Use el nombre y la clave de la cuenta de Blob Storage para crear storageSharedKeyCredential. Esta clave es necesaria para crear el token de SAS y usarlo.

Cree una StorageSharedKeyCredential con el nombre de la cuenta de almacenamiento y la clave de la cuenta. A continuación, use StorageSharedKeyCredential para inicializar un objeto BlobServiceClient.

const constants = {
    accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME,
    accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY
};
const sharedKeyCredential = new StorageSharedKeyCredential(
    constants.accountName,
    constants.accountKey
);

Modelo de operación asincrónica

En los fragmentos de código de ejemplo restantes se asume el siguiente código reutilizable asincrónico para Node.js.

async function main() {

    const sasToken = await createAccountSas();

    await useSasToken(sasToken);
}

main()
    .then(() => {
        console.log(`done`);
    }).catch((ex) => {
        console.log(`Error: ${ex.message}`)
    });

Creación de un token de SAS

Dado que este token se puede usar con blobs, colas, tablas y archivos, algunas de las opciones de configuración son más amplias que las que se refieren solo a los blobs.

  1. Cree el objeto options.

    El ámbito de las capacidades de un token de SAS se define mediante AccountSASSignatureValues.

    Use las siguientes funciones auxiliares que proporciona el SDK para crear los tipos de valor correctos para los valores:

  2. Pase el objeto a la función generateAccountSASQueryParameters, junto con SharedKeyCredential, para crear el token de SAS.

    Antes de devolver el token de SAS, anteponga el delimitador de cadena de consulta, ?.

    async function createAccountSas() {
    
        const sasOptions = {
    
            services: AccountSASServices.parse("btqf").toString(),          // blobs, tables, queues, files
            resourceTypes: AccountSASResourceTypes.parse("sco").toString(), // service, container, object
            permissions: AccountSASPermissions.parse("rwdlacupi"),          // permissions
            protocol: SASProtocol.Https,
            startsOn: new Date(),
            expiresOn: new Date(new Date().valueOf() + (10 * 60 * 1000)),   // 10 minutes
        };
    
        const sasToken = generateAccountSASQueryParameters(
            sasOptions,
            sharedKeyCredential 
        ).toString();
    
        console.log(`sasToken = '${sasToken}'\n`);
    
        // prepend sasToken with `?`
        return (sasToken[0] === '?') ? sasToken : `?${sasToken}`;
    }
    
  3. Proteja el token de SAS hasta que se use.

Uso de Blob service con el token de SAS de cuenta

Para usar el token de SAS de cuenta, debe combinarlo con el nombre de cuenta para crear el URI. Pase el URI para crear blobServiceClient. Una vez que tenga blobServiceClient, puede usar ese cliente para acceder a Blob service.

// connect-with-sas-token.js
const { BlobServiceClient } = require('@azure/storage-blob');
require('dotenv').config()

const accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const sasToken = process.env.AZURE_STORAGE_SAS_TOKEN;
if (!accountName) throw Error('Azure Storage accountName not found');
if (!sasToken) throw Error('Azure Storage accountKey not found');

const blobServiceUri = `https://${accountName}.blob.core.windows.net`;

// https://YOUR-RESOURCE-NAME.blob.core.windows.net?YOUR-SAS-TOKEN
const blobServiceClient = new BlobServiceClient(
  `${blobServiceUri}?${sasToken}`,
  null
);

async function main(){
  
  const containerName = 'REPLACE-WITH-EXISTING-CONTAINER-NAME';
  const blobName = 'REPLACE-WITH-EXISTING-BLOB-NAME';

  const timestamp = Date.now();
  const fileName = `my-new-file-${timestamp}.txt`;

  // create container client
  const containerClient = await blobServiceClient.getContainerClient(containerName);

  // create blob client
  const blobClient = await containerClient.getBlockBlobClient(blobName);

  // download file
  await blobClient.downloadToFile(fileName);

  console.log(`${fileName} downloaded`);
  
}

main()
  .then(() => console.log(`done`))
  .catch((ex) => console.log(`error: ${ex.message}`));

El paquete dotenv se usa para leer el nombre de la cuenta de almacenamiento de un archivo .env. No hace falta comprobar este archivo en el control de código fuente.

Vea también