es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error al crear la URL con firma para mi objeto privado del bucket, Ruby on Rails.

Mientras intento crear una URL prefirmada para mi archivo PNG en mi bucket privado de S3, obtuve este error, ¿cómo puedo resolverlo?


Error de parámetros de autorización de consulta
La versión 4 de autenticación de cadena de consulta requiere los parámetros X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders y X-Amz-Expires.

Mi código:

require 'aws-sdk-s3'

<h1>Credenciales a continuación para el usuario IAM que estoy utilizando</h1>

s3 = Aws::S3::Client.new(
region: 'us-east-1',
access_key_id: AccessKeyId,
secret_access_key: SecretAccessKey
)

signer = Aws::S3::Presigner.new(client: s3)

url = signer.presigned_url(
:put_object,
bucket: 'my bucketname',
key: "${engine.png}-#{SecureRandom.uuid}"
)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que faltan algunos parámetros obligatorios en el proceso de creación de la URL prefirmada. Para resolver el problema, debes agregar los parámetros necesarios, como X-Amz-Algorithm, X-Amz-Credential, X-Amz-Signature, X-Amz-Date, X-Amz-SignedHeaders y X-Amz-Expires, en la URL prefirmada. Así es como puedes modificar tu código para agregar estos parámetros:

    require 'aws-sdk-s3'
    
    # Credenciales a continuación para el usuario IAM que estoy utilizando
    
    s3 = Aws::S3::Client.new(
    
      region: 'us-east-1',
    
      access_key_id: Access_Key_Id,
    
      secret_access_key: Secret_access_key
    
    )
    
    signer = Aws::S3::Presigner.new(client: s3)
    
    url = signer.presigned_url(
    
      :put_object,
    
      bucket: 'mi nombre de bucket',
    
      key: "${engine.png}-#{SecureRandom.uuid}",
    
      acl: 'private',
    
      content_type: 'image/png',
    
      content_disposition: 'attachment',
    
      x_amz_algorithm: 'AWS4-HMAC-SHA256',
    
      x_amz_credential: "#{s3.config.credentials.access_key_id}/#{Time.now.strftime('%Y%m%d')}/us-east-1/s3/aws4_request",
    
      x_amz_date: Time.now.utc.strftime('%Y%m%dT%H%M%SZ'),
    
      x_amz_expires: 3600,
    
      x_amz_signed_headers: 'content-type;host',
    
      x_amz_signature: ' <calcular la="" firma="" basada="" en="" los="" detalles="" anteriores="">'
    
    )
    
    

    En el código anterior, estás agregando los parámetros requeridos de la siguiente manera:

    • acl: Nivel de control de acceso (en este caso, privado)
    • content_type: tipo MIME del objeto
    • content_disposition: especifica información de presentación para el objeto que se devolverá en la respuesta
    • x_amz_algorithm: nombre del algoritmo que se utilizará para calcular la firma (en este caso, AWS4-HMAC-SHA256)
    • x_amz_credential: especifica las credenciales de seguridad utilizadas para firmar las solicitudes (ID de clave de acceso y fecha)
    • x_amz_date: fecha y hora para las que se debe calcular la firma
    • x_amz_expires: tiempo de expiración de la URL
    • x_amz_signed_headers: una lista de encabezados de solicitud que utilizaste para calcular la firma
    • x_amz_signature: la firma calculada

    Debes calcular la firma en función de los parámetros anteriores, incluida la clave de acceso secreta, utilizando el AWS SDK para Ruby u otras bibliotecas adecuadas. Una vez que agregues la firma a la URL prefirmada, debería funcionar sin problemas.

Comments are closed.