Windows Azure: establecer propiedades CORS blob usando NodeJS

La API REST se lanzó en febrero para establecer la propiedad CORS de blob, pero esto aún no se ha implementado para NodeJS.

Como necesito esta función, traté de implementarla en un módulo para mi sitio web de Azure que ejecuta NodeJS.

Basándome en la documentación de la API REST para cambiar las propiedades de CORS y generar la clave de autenticación , en esta implementación de la generación de clave de autenticación mediante NodeJS, intenté seguir la respuesta aceptada de esta publicación, pero no me funcionó.

Aquí está lo que tengo en setcrosproperties.js:

var crypto = require('crypto'); var request = require('request'); exports.setCors = function (MY_ACCOUNT_URL, MY_ACCOUNT_NAME, MY_ACCOUNT_HOST, accountKey) { var MY_CORS_XML = ''+ ''+ ''+ ''+ '*'+ 'GET,PUT'+ '500'+ 'x-ms-meta-data*,x-ms-meta-customheader'+ 'x-ms-meta-target*,x-ms-meta-customheader'+ ''+ ''+ '2013-08-15'+ ''; var url = MY_ACCOUNT_URL + '/?restype=service&comp=properties'; var canonicalizedResource = '/' + MY_ACCOUNT_NAME + '/?comp=properties'; var corsMD5 = crypto.createHash('md5' ).update(MY_CORS_XML).digest('base64'); var date = (new Date()).toUTCString(); var headers = { 'x-ms-version': '2013-08-15', 'x-ms-date': date, 'Host': MY_ACCOUNT_HOST }; var canonicalizedHeaders = buildCanonicalizedHeaders( headers ); // THIS var key = buildSharedKeyLite( 'PUT', corsMD5, 'text/plain; charset=UTF-8', canonicalizedHeaders, canonicalizedResource, accountKey); // AND THIS, BOTH YIELD THE SAME SERVER RESPONSE // var key = buildSharedKeyLite( 'PUT', "", "", canonicalizedHeaders, canonicalizedResource, accountKey); headers['Authorization'] = 'SharedKeyLite ' + MY_ACCOUNT_NAME + ':' + key; var options = { url: url, body: MY_CORS_XML, headers: headers }; console.log("url : " + url); console.log("canonicalizedResource : " + canonicalizedResource); console.log("canonicalizedHeaders : " + canonicalizedHeaders); console.log("corsMD5 : " + corsMD5); console.log("key : " + key); console.log("options : " + JSON.stringify(options)); function onPropertiesSet(error, response, body) { if (!error && response.statusCode == 202) { console.log("CORS: OK"); } else { console.log("CORS: " + response.statusCode); console.log("body : " + body); } } request.put(options, onPropertiesSet); // require('request') }; function buildCanonicalizedHeaders( headers ) { var xmsHeaders = []; var canHeaders = ""; for ( var name in headers ) { if ( name.indexOf('x-ms-') == 0 ) { xmsHeaders.push( name ); } } xmsHeaders.sort(); for ( var i = 0; i < xmsHeaders.length; i++ ) { name = xmsHeaders[i]; canHeaders = canHeaders + name.toLowerCase().trim() + ':' + headers[name] + '\n'; } return canHeaders; } function buildSharedKeyLite( verb, contentMD5, contentType, canonicalizedHeaders, canonicalizedResource, accountKey) { var stringToSign = verb + "\n" + contentMD5 + "\n" + contentType + "\n" + "" + "\n" + // date is to be empty because we use x-ms-date canonicalizedHeaders + canonicalizedResource; // return crypto.createHmac('sha256', accountKey).update(encodeURIComponent(stringToSign)).digest('base64'); return crypto.createHmac('sha256', new Buffer(accountKey, 'base64')).update(stringToSign).digest('base64'); } 

Y aquí es cómo llamo a esta función desde mi archivo server.js:

 var setcrosproperties = require('./setcrosproperties.js'); // setCors(MY_ACCOUNT_URL, MY_ACCOUNT_NAME, MY_ACCOUNT_HOST, accountKey) setcrosproperties.setCors( 'https://'+process.env['AZURE_STORAGE_ACCOUNT']+'.blob.core.windows.net', process.env['AZURE_STORAGE_ACCOUNT'], process.env['AZURE_STORAGE_ACCOUNT']+'.blob.core.windows.net', process.env['AZURE_STORAGE_ACCESS_KEY']); 

No entendí cuál era la diferencia prevista con las variables MY_ACCOUNT_UTL (asumí URL) y MY_ACCOUNT_HOST, así que uso el mismo valor para ambos parámetros de la función.

(Eliminé el parámetro “cors”, que parecía estar sin usar.)

Esto es lo que obtengo en la consola:

url: https://NAME_OF_MY_STORAGE_ACCOUNT.blob.core.windows.net/?restype=service&comp=properties canonicalizedResource: / NAME_OF_MY_STORAGE_ACCOUNT /? comp = Properties canonicalizedHeaders: x-ms-date: domingo, 9 de marzo de 2014 x-ms-versión: 2013-08-15 corsMD5: + ij … w == clave: sNB … JrY = opciones: {“url”: ” https://NAME_OF_MY_STORAGE_ACCOUNT.blob.core.windows.net /? restype = service & comp = properties “,” body “:” GET, PUT500x-ms-metadatos , x-ms-meta-customheaderx-ms-meta-target *, x-ms-meta-customheader2013-08-15 “,” headers “: {” x-ms-version “:” 2013-08-15 “,” x-ms-date “:” Sun, 09 Mar 2014 12:33:41 GMT “,” Host “:” NAME_OF_MY_STORAGE_ACCOUNT.blob.core.windows.net “,” Autorización “:” SharedKeyLite NAME_OF_MY_STORAGE_ACCOUNT: sNB … rY = “}} CORS: 403 body: AuthenticationFailed Server no pudo autenticar la solicitud. Asegúrese de que el valor del encabezado de autorización se forme correctamente, incluida la firma. RequestId: 1e6abfe3-e0e8-4b9c-922d-7cb34485eec9 Time: 2014-03-09T12: 33: 41.7262308ZLa firma MAC encontrada en la solicitud HTTP ‘sNB … JrY =’ no es lo mismo que cualquier firma computada. Servidor utilizado la siguiente cadena para firmar: ‘PUT

x-ms-fecha: domingo, 09 de marzo de 2014 12:33:41 GMT x-ms-versión: 2013-08-15 / NAME_OF_MY_STORAGE_ACCOUNT /? comp = properties ‘.

¿Alguna idea de lo que estoy haciendo mal aquí? Gracias por tu ayuda