IBM Cloud Docs
Création d'une URL présignée

Création d'une URL présignée

Les URL présignées dans IBM Cloud® Object Storage créent des liens temporaires qui peuvent être utilisés pour partager un objet sans nécessiter de données d'identification utilisateur supplémentaires lors de l'accès.

Bien entendu, on peut également fournir une cible temporaire pour l'envoi d'une demande PUT sans avoir à fournir d'autres informations pour l'authentification. La méthode la plus simple pour créer des URL présignées consiste à utiliser l'interface de ligne de commandeAWS. Mais tout d'abord, vous devrez peut-être exécuter aws configure afin de définir votre ID de clé d'accès et votre clé d'accès secrète à partir de vos propres données d'identification de service HMAC. Une fois que vous avez terminé de configurer votre interface de ligne de commande, utilisez l'exemple suivant comme modèle et remplacez le noeud final et le nom de votre compartiment par les informations appropriées:

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

Si les données d'identification de service utilisées pour générer les données d'identification HMAC (utilisées comme ID de clé d'accès et configuration de clé d'accès secrète ci-dessus) sont supprimées, l'accès à l'URL présignée échouera.

Il est également possible de définir un délai d'expiration pour l'URL (la valeur par défaut est 3600 secondes) :

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

Il est également possible de les construire à l'aide d'un programme. Voici des exemples d'opérations GET de base écrites en Python. Pour plus d'informations sur les noeuds finaux, voir Noeuds finaux et emplacements de stockage.

Contrairement à AWS S3, IBM Cloud Object Storage n'impose pas un délai d'expiration maximal de 7 jours (604800 secondes). Bien qu'il soit possible de créer une URL présignée avec une valeur d'expiration longue, la plupart des cas d'utilisation nécessitant un accès public étendu seraient mieux servis en implémentant une règle d'accès public sur un compartiment à la place.

Créer une URL présignée pour télécharger un objet

Exemple en 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)

Exemple en 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);

Créer une URL présignée pour télécharger un objet

Exemple en 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)