AWS S3 generando URL firmadas ” AccessDenied ”

Estoy usando NodeJs para cargar archivos en AWS S3. Quiero que el cliente pueda descargar los archivos de forma segura. Así que estoy tratando de generar URL firmadas, que caducan después de un uso. Mi código se ve así:

Subiendo

const s3bucket = new AWS.S3({ accessKeyId: 'my-access-key-id', secretAccessKey: 'my-secret-access-key', Bucket: 'my-bucket-name', }) const uploadParams = { Body: file.data, Bucket: 'my-bucket-name', ContentType: file.mimetype, Key: `files/${file.name}`, } s3bucket.upload(uploadParams, function (err, data) { // ... }) 

Descargando

 const url = s3bucket.getSignedUrl('getObject', { Bucket: 'my-bucket-name', Key: 'file-key', Expires: 300, }) 

Problema

Al abrir la URL me sale lo siguiente:

 This XML file does not appear to have any style information associated with it. The document tree is shown below.  AccessDenied  There were headers present in the request which were not signed  host D63C8ED4CD8F4E5F  9M0r2M3XkRU0JLn7cv5QN3S34G8mYZEy/v16c6JFRZSzDBa2UXaMLkHoyuN7YIt/LCPNnpQLmF4=   

No pude encontrar el error. Realmente apreciaria cualquier ayuda 🙂

Su código es correcto, verifique dos veces lo siguiente:

  1. Su política de acceso al cubo.

  2. Su permiso de cubo a través de su clave API.

  3. Su clave API y secreto.

  4. Su nombre y clave de cubo.

Para la política de cangilones puede usar lo siguiente:

 { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket/*" } ] } 

Cambia el cubo con el nombre de tu cubo.

Para los usuarios y el permiso de clave de acceso (# 2), debe seguir estos pasos:

1-Ir a AWS Identity and Access Management (IAM) y haga clic en el enlace de Políticas y haga clic en el botón “Crear política”.

introduzca la descripción de la imagen aquí

2-Seleccione la pestaña JSON.

introduzca la descripción de la imagen aquí

3-Ingrese la siguiente statement, asegúrese de cambiar el nombre del grupo y haga clic en el botón “revisar política”.

 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::YOURBUCKETNAME" } ] } 

introduzca la descripción de la imagen aquí

4-Ingrese un nombre para su política y haga clic en el botón “Crear política”.

introduzca la descripción de la imagen aquí

5-Haga clic en el enlace Usuarios y busque su nombre de usuario actual (ya tiene la clave de acceso y el secreto para eso)

introduzca la descripción de la imagen aquí

6-Haga clic en el botón “Agregar permiso”.

introduzca la descripción de la imagen aquí

7-Agregar la política que creamos en el paso anterior y guardar.

introduzca la descripción de la imagen aquí

Finalmente, asegúrese de que no se pueda acceder a su grupo desde Público, agregue el tipo de contenido correcto a su archivo y establezca signatureVersion: 'v4'

El código final debería ser así, gracias @Vaisakh PS:

 const s3bucket = new AWS.S3({ signatureVersion: 'v4', accessKeyId: 'my-access-key-id', secretAccessKey: 'my-secret-access-key', Bucket: 'my-bucket-name', }) const uploadParams = { Body: file.data, Bucket: 'my-bucket-name', ContentType: file.mimetype, Key: `files/${file.name}`, } s3bucket.upload(uploadParams, function (err, data) { // ... }) const url = s3bucket.getSignedUrl('getObject', { Bucket: 'my-bucket-name', Key: 'file-key', Expires: 300, }) 

Su código se ve bien, pero creo que le falta el parámetro signatureVersion: 'v4' al crear el objeto s3bucket . Por favor, intente el siguiente código actualizado.

 const s3bucket = new AWS.S3({ signatureVersion: 'v4', accessKeyId: 'my-access-key-id', secretAccessKey: 'my-secret-access-key', Bucket: 'my-bucket-name', }) const uploadParams = { Body: file.data, Bucket: 'my-bucket-name', ContentType: file.mimetype, Key: `files/${file.name}`, } s3bucket.upload(uploadParams, function (err, data) { // ... }) const url = s3bucket.getSignedUrl('getObject', { Bucket: 'my-bucket-name', Key: 'file-key', Expires: 300, }) 

Para más información sobre signatureVersion: 'v4' vea los enlaces a continuación

https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html

https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html

También puede probar la siguiente biblioteca de nodejs que crea la presigned url

https://www.npmjs.com/package/aws-signature-v4

    Intereting Posts