Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

218
Vistas
Cargue un archivo en Amazon S3 con una URL prefirmada + solicitud PUT pero obtenga el error "SignatureDoesNotMatch" para "GET" en "StringToSign"

Estoy tratando de cargar archivos en Amazon S3 con una URL prefirmada con javascript fetch () de la siguiente manera (copie el pasado de la herramienta Chrome Developer)

 fetch("https://.....amazonaws.com/.../copy.mp3?AWSAccessKeyId=...&Signature=...&Expires=1631443785", { "headers": { "content-type": "audio/mpeg", "sec-ch-ua": "\"Google Chrome\";v=\"93\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"93\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"macOS\"" }, "referrer": "http://localhost:3000/", "referrerPolicy": "strict-origin-when-cross-origin", "method": "PUT", "mode": "cors", "credentials": "omit" });

y devuelve el siguiente error "SignatureDoesNotMatch":

 <Error> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message> <AWSAccessKeyId>...</AWSAccessKeyId> <StringToSign>GET 1631443785 ..../copy.mp3</StringToSign> ... </Error>

El StringToSign en el error dice que es una solicitud "GET" mientras creo que estoy enviando un PUT con fetch() .

Además, trato de ejecutar $curl como:

 $curl --request PUT --upload-file copy.mp3 https://....'

y funciona.

¿Algo que esté haciendo mal aquí?

Gracias de antemano. He estado bloqueado aquí por 2 días :(

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Descubrí cómo cargar con la solicitud POST (en lugar de PUT, es una solución alternativa) y así es como:

Para su navegador:

 const formData = new FormData(); Object.keys(signedPost.fields).forEach(key => { formData.append(key, signedPost.fields[key]); }); // You must put the file in the last position otherwise S3 complains: // "Bucket POST must contain a field named 'key'. If it is specified, please check the order of the fields." // If any people who works for Amazon S3 see this error msg, please fix it.. // It's confusing. Using Eg "Put file in the last position" instead. formData.append("file", file); fetch( signedPost.url, { method: "POST", body: formData, } ).then( res => console.log(res), ).catch((error) => { console.log(error); throw error; });

Para su servidor: use la API generate_presigned_post en lugar de generate_presigned_url . P.ej:

 respone = s3_client.generate_presigned_post( Bucket=bucket, Key=key, ExpiresIn=expires_in_s, )

Mi comprensión de mis problemas originales hasta ahora: para mi problema original de solicitud de OPCIONES de bloqueo previo al vuelo "SignatureDoesNotMatch", la solicitud posterior omite la solicitud de OPCIONES. Como resultado, la publicación firmó una solución alternativa. Esa es también la razón por la que $curl + PUT funciona, pero javascript PUT en Chrome no funciona exactamente para la misma URL prefirmada para las solicitudes PUT. $curl no ejecuta OPCIONES de verificación previa. Pero para javascript en Chrome, se ejecuta (a) Enviar OPCIONES (b) Enviar PUT y me bloquearon en (a). Como la discusión en (1), a alguien le gustó casi el mismo problema hace 7 años y todavía no tenemos una buena respuesta para esa pregunta. Con una solución de publicación de trabajo, lo dejaría pasar en lugar de gastar más tiempo en esto. Sin embargo, sería genial si alguien de Amazon pudiera crear un ticket si es necesario.

referencia:

  • (1) aquí hay un problema muy similar pero no es exactamente igual.
  • (2) Ejemplo de URL prefirmadas de Amazon
  • (3) ¿Cuál es la diferencia entre generate_presigned_post y generate_presigned_url ? .
about 4 years ago · Juan Pablo Isaza Denunciar

0

Hay un ejemplo de cómo hacer esto usando fetch en los documentos de aws:

 // Import the required AWS SDK clients and commands for Node.js import { CreateBucketCommand, DeleteObjectCommand, PutObjectCommand, DeleteBucketCommand } from "@aws-sdk/client-s3"; import { s3Client } from "./libs/s3Client.js"; // Helper function that creates Amazon S3 service client module. import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import fetch from "node-fetch"; // Set parameters // Create a random names for the Amazon Simple Storage Service (Amazon S3) bucket and key export const bucketParams = { Bucket: `test-bucket-${Math.ceil(Math.random() * 10 ** 10)}`, Key: `test-object-${Math.ceil(Math.random() * 10 ** 10)}`, Body: "BODY" }; export const run = async () => { try { // Create an Amazon S3 bucket. console.log(`Creating bucket ${bucketParams.Bucket}`); await s3Client.send(new CreateBucketCommand({ Bucket: bucketParams.Bucket })); console.log(`Waiting for "${bucketParams.Bucket}" bucket creation...`); } catch (err) { console.log("Error creating bucket", err); } try { // Create the command. const command = new PutObjectCommand(bucketParams); // Create the presigned URL. const signedUrl = await getSignedUrl(s3Client, command, { expiresIn: 3600, }); console.log( `\nPutting "${bucketParams.Key}" using signedUrl with body "${bucketParams.Body}" in v3` ); console.log(signedUrl); const response = await fetch(signedUrl); console.log( `\nResponse returned by signed URL: ${await response.text()}\n` ); return response; } catch (err) { console.log("Error creating presigned URL", err); } try { // Delete the object. console.log(`\nDeleting object "${bucketParams.Key}"} from bucket`); await s3Client.send( new DeleteObjectCommand({ Bucket: bucketParams.Bucket, Key: bucketParams.Key }) ); } catch (err) { console.log("Error deleting object", err); } try { // Delete the Amazon S3 bucket. console.log(`\nDeleting bucket ${bucketParams.Bucket}`); await s3.send(new DeleteBucketCommand({ Bucket: bucketParams.Bucket })); } catch (err) { console.log("Error deleting bucket", err); } }; run();

Es un poco más de lo que necesitas probablemente. Más información aquí

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda