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)