Vorab signierte URL erstellen
Vorab signierte URLs in IBM Cloud® Object Storage erstellen temporäre Links, die verwendet werden können, um ein Objekt gemeinsam zu nutzen, ohne dass beim Zugriff zusätzliche Benutzerberechtigungsnachweise erforderlich sind.
Natürlich kann auch ein temporäres Ziel zum Senden einer PUT-Anforderung bereitgestellt werden, ohne dass weitere Informationen
für die Authentifizierung bereitgestellt werden müssen. Die einfachste Methode zum Erstellen vorab signierter URLs ist die Verwendung der AWS-CLI. Zunächst müssen Sie
jedoch möglicherweise aws configure ausführen, um Ihre Zugriffsschlüssel-ID und Ihren geheimen Zugriffsschlüssel aus Ihrem eigenen HMAC-fähigen Serviceberechtigungsnachweis festzulegen. Wenn Sie Ihre CLI konfiguriert haben, verwenden Sie das folgende Beispiel als Vorlage und ersetzen Sie den Endpunkt und den Namen Ihres Buckets durch die entsprechenden Informationen:
$ aws --endpoint-url=https://{endpoint} s3 presign s3://{bucket-name}/{new-file-key}
Wenn der Serviceberechtigungsnachweis, der zum Generieren der HMAC-Berechtigungsnachweise verwendet wird (oben als Konfiguration für die Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel verwendet) gelöscht wird, schlägt der Zugriff für die vorab signierte URL fehl.
Es ist außerdem möglich, eine Ablaufzeit für die URL in Sekunden festzulegen (Standardwert ist 3600):
$ aws --endpoint-url=https://{endpoint} s3 presign s3://bucket-1/new-file --expires-in 600
Signierte URLs können auch programmgesteuert erzeugt werden. Die nachfolgenden Beispiele veranschaulichen grundlegende, in Python geschriebene GET-Operationen. Weitere Informationen zu Endpunkten enthält Endpunkte und Speicherpositionen.
Im Gegensatz zu AWS S3erzwingt IBM Cloud Object Storage keine maximale Ablaufzeit von 7 Tagen (604800 Sekunden). Es ist zwar möglich, eine vorab signierte URL mit einem langen Ablaufwert zu erstellen, aber die meisten Anwendungsfälle, die erweiterten öffentlichen Zugriff erfordern, würden besser durch die Implementierung einer Richtlinie für öffentlichen Zugriff in einem Bucket bedient.
Vorsignierte URL zum Herunterladen eines Objekts erstellen
Python-Beispiel
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)
Java-Beispiel
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);
Vorab signierte URL zum Hochladen eines Objekts erstellen
Python-Beispiel
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)