Creación de un URL prefirmado

Los URL prefirmados en IBM Cloud® Object Storage crean enlaces temporales que se pueden utilizar para compartir un objeto sin requerir credenciales de usuario adicionales cuando se accede.

Por supuesto, también se puede proporcionar un destino temporal para enviar una solicitud PUT sin necesidad de proporcionar más información para la autenticación. La forma más fácil de crear URL prefirmados es utilizando la CLI deAWS. Pero en primer lugar, es posible que tenga que ejecutar aws configure para establecer el ID de clave de acceso y la clave de acceso secreta desde su propia credencial de servicio habilitada para HMAC. Cuando haya terminado de configurar la CLI, utilice el ejemplo siguiente como plantilla y sustituya el punto final y el nombre del grupo con la información adecuada:

$ aws --endpoint-url=https://{endpoint} s3 presign s3://{bucket-name}/{new-file-key}

Si se suprime la credencial de servicio utilizada para generar las credenciales HMAC (utilizadas como el ID de clave de acceso y la configuración de clave de acceso secreta anterior), el acceso para el URL prefirmado fallará.

También se puede establecer un tiempo de caducidad para el URL en segundos (el valor predeterminado es 3600):

$ aws --endpoint-url=https://{endpoint} s3 presign s3://bucket-1/new-file --expires-in 600

También se pueden crear mediante programación. A continuación se muestran ejemplos de operaciones GET básicas escritas en Python. Para obtener más información sobre puntos finales, consulte Puntos finales y ubicaciones de almacenamiento.

A diferencia de AWS S3, IBM Cloud Object Storage no impone un tiempo de caducidad máximo de 7 días (604800 segundos). Aunque es posible crear un URL prefirmado con un valor de caducidad largo, la mayoría de los casos de uso que requieren acceso público ampliado se servirían mejor implementando una política de acceso público en un grupo en su lugar.

Crear un URL prefirmado para descargar un objeto

Ejemplo de Python

import ibm_boto3
import os

bucket_name = '<bucekt name>'
key_name = '<object key name>'
http_method = 'get_object'
expiration = 600  # time in seconds, default:600

access_key = os.environ.get('COS_HMAC_ACCESS_KEY_ID')
secret_key = os.environ.get('COS_HMAC_SECRET_ACCESS_KEY')
# Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
cos_service_endpoint = 'https://s3.<region>.cloud-object-storage.appdomain.cloud'

cos = ibm_boto3.client("s3",
                       aws_access_key_id=access_key,
                       aws_secret_access_key=secret_key,
                       endpoint_url=cos_service_endpoint
                       )

signedUrl = cos.generate_presigned_url(http_method, Params={
                                       'Bucket': bucket_name, 'Key': key_name}, ExpiresIn=expiration)
print("presigned download URL =>" + signedUrl)

Ejemplo de Java

import java.util.Date;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.ibm.cloud.objectstorage.HttpMethod;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.GeneratePresignedUrlRequest;


String bucketName = "<bucket name>";
String keyName = "<object key name>";
HttpMethod httpMethod = HttpMethod.GET;
Date expiration = new Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 60;
expiration.setTime(expTimeMillis);

String accessKey = "<COS_HMAC_ACCESS_KEY_ID>";
String secretAccessKey = "<COS_HMAC_SECRET_ACCESS_KEY>";
// Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
String cosServiceEndpoint = "https://s3.<region>.cloud-object-storage.appdomain.cloud";

AmazonS3 cosClient = AmazonS3ClientBuilder.standard()
                     .withEndpointConfiguration(new EndpointConfiguration(cosServiceEndpoint, "us-east-1"))
                     .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretAccessKey))).withPathStyleAccessEnabled(true)
                     .build();

GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName)
                                                          .withMethod(httpMethod)
                                                          .withExpiration(expiration);

URL signedUrl = cosClient.generatePresignedUrl(generatePresignedUrlRequest);
System.out.println(signedUrl);

Crear un URL prefirmado para cargar un objeto

Ejemplo de Python

import ibm_boto3
import os

bucket_name = '<bucket name>'
key_name = '<object key name>'
http_method = 'put_object'
expiration = 600  # time in seconds, default:600

access_key = os.environ.get('COS_HMAC_ACCESS_KEY_ID')
secret_key = os.environ.get('COS_HMAC_SECRET_ACCESS_KEY')
# Current list avaiable at https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints
cos_service_endpoint = 'https://s3.<region>.cloud-object-storage.appdomain.cloud'

cos = ibm_boto3.client("s3",
                       aws_access_key_id=access_key,
                       aws_secret_access_key=secret_key,
                       endpoint_url=cos_service_endpoint
                       )

signedUrl = cos.generate_presigned_url(http_method, Params={
                                       'Bucket': bucket_name, 'Key': key_name}, ExpiresIn=expiration)
print("presigned upload URL =>" + signedUrl)