Saltar al contenido

Creación de URL firmadas de S3 y Cloudfront mediante el SDK de AWS

Poseemos la mejor solución que hallamos on line. Nosotros esperamos que te sea útil y si puedes compartir algo que nos pueda ayudar a mejorar hazlo con total libertad.

Solución:

Actualizar: Moví la funcionalidad de firma del código de ejemplo a continuación al paquete aws-cloudfront-sign en NPM. De esa manera, solo puede solicitar este paquete y llamar getSignedUrl().


Después de investigar un poco más, encontré una solución que es una especie de combinación entre esta respuesta y un método que encontré en la biblioteca de Boto. Está true que las firmas de URL de S3 se manejan de manera diferente a las firmas de URL de CloudFront. Si solo necesita firmar un enlace S3, entonces el código de ejemplo en mi pregunta inicial funcionará bien para usted. Sin embargo, se vuelve un poco más complicado si desea generar URL firmadas que utilicen su distribución de CloudFront. Esto se debe a que las firmas de URL de CloudFront no se admiten actualmente en el SDK de AWS, por lo que debe crear la firma por su cuenta. En caso de que también necesite hacer esto, aquí hay pasos básicos. Asumiré que ya tiene una configuración de depósito S3:

Configurar CloudFront

  1. Crear una distribución de CloudFront
  2. Configura tu origen con los siguientes ajustes
    • Nombre de dominio de origen: your-s3-bucket
    • Restringir el acceso al depósito: Sí
    • Otorgar permisos de lectura en el depósito: sí, actualizar la política del depósito
  3. Cree un par de claves de CloudFront. Debería poder hacer esto aquí.

Crear URL de CloudFront firmada

Para mejorar una URL de CloudFront firmada, solo necesita firmar su política mediante RSA-SHA1 e incluirla como un parámetro de consulta. Puede encontrar más información sobre políticas personalizadas aquí, pero he incluido una básica en el código de muestra a continuación que debería ayudarlo a comenzar a trabajar. El código de muestra es para Node.js, pero el proceso podría aplicarse a cualquier idioma.

var crypto = require('crypto')
  , fs = require('fs')
  , util = require('util')
  , moment = require('moment')
  , urlParse = require('url')
  , cloudfrontAccessKey = ''
  , expiration = moment().add('seconds', 30)  // epoch-expiration-time

// Define your policy.
var policy = 
   'Statement': [
      'Resource': 'http:///path/to/object',
      'Condition': 
         'DateLessThan': 'AWS:EpochTime': '',
      
   ]


// Now that you have your policy defined you can sign it like this:
var sign = crypto.createSign('RSA-SHA1')
  , pem = fs.readFileSync('') 
  , key = pem.toString('ascii')

sign.update(JSON.stringify(policy))
var signature = sign.sign(key, 'base64')

// Finally, you build the URL with all of the required query params:
var url = 
  host: '',
  protocol: 'http',
  pathname: ''
    
var params = 
  'Key-Pair-Id=' + cloudfrontAccessKey,
  'Expires=' + expiration,
  'Signature=' + signature

var signedUrl = util.format('%s?%s', urlParse.format(url), params.join('&'))

return signedUrl

Para que mi código funcione con el código de Jason Sims, también tuve que convertir la política a base64 y agregarla a la URL firmada final, así:

sign.update(JSON.stringify(policy))
var signature = sign.sign(key, 'base64')

var policy_64 = new Buffer(JSON.stringify(policy)).toString('base64'); // ADDED

// Finally, you build the URL with all of the required query params:
var url = 
  host: '',
  protocol: 'http',
  pathname: ''
    
var params = 
  'Key-Pair-Id=' + cloudfrontAccessKey,
  'Expires=' + expiration,
  'Signature=' + signature,
  'Policy=' + policy_64  // ADDED 

Comentarios y puntuaciones del tutorial

Si te mola la invitación, eres capaz de dejar una noticia acerca de qué le añadirías a esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *