Cette rubrique explique comment utiliser Alibaba Cloud Security Token Service (STS) et les URL pré-signées pour accorder un accès temporaire aux ressources Object Storage Service (OSS).
Notes
Vous devez définir une durée de validité pour les identifiants temporaires STS ainsi que pour les URL pré-signées. Si vous utilisez des identifiants temporaires STS pour générer une URL pré-signée, la durée de validité la plus courte s'applique. Par exemple, si vous définissez la durée de validité de vos identifiants temporaires STS à 1 200 secondes et celle de l'URL pré-signée à 3 600 secondes, l'URL pré-signée expirera au bout de 1 200 secondes.
Cette rubrique utilise le point de terminaison public de la région Chine (Hangzhou) à titre d'exemple. Si vous souhaitez accéder à OSS depuis d'autres produits Alibaba Cloud dans la même région, utilisez un point de terminaison interne. Pour plus d'informations sur les régions et les points de terminaison pris en charge par OSS, consultez Régions et points de terminaison.
Cette rubrique fournit un exemple de création d'un client à l'aide d'un nom de domaine OSS. Pour savoir comment créer un OSSClient à l'aide d'un nom de domaine personnalisé ou de STS, consultez Initialiser un client.
Utiliser STS pour l'autorisation temporaire
Vous pouvez utiliser Alibaba Cloud Security Token Service (STS) pour accorder un accès temporaire à OSS. STS est un service web qui fournit des jetons d'accès temporaires aux utilisateurs du cloud computing. Avec STS, vous pouvez émettre un identifiant d'accès temporaire avec une durée de validité et des permissions personnalisées à des applications tierces ou à des sous-utilisateurs. Un sous-utilisateur est un utilisateur dont vous gérez l'identité. Pour plus d'informations sur STS, consultez Qu'est-ce que STS ?.
Les avantages de STS sont les suivants :
Vous n'avez pas besoin d'exposer votre paire AccessKey à long terme à des applications tierces. Vous pouvez plutôt générer un jeton d'accès temporaire avec des permissions d'accès personnalisées et une durée de validité spécifique à fournir à l'application.
Vous n'avez pas besoin de révoquer manuellement les permissions. L'accès est automatiquement révoqué à l'expiration du jeton.
Les étapes suivantes décrivent comment utiliser STS pour accorder un accès temporaire à OSS :
-
Obtenir des identifiants d'accès temporaires
Les identifiants d'accès temporaires incluent une paire AccessKey temporaire (un AccessKey ID et un AccessKey secret) ainsi qu'un jeton de sécurité. La durée de validité est mesurée en secondes. La valeur minimale est de 900 secondes. La valeur maximale correspond à la durée de session maximale définie pour le rôle RAM. Pour plus d'informations, consultez Définir la durée de session maximale pour un rôle RAM.
Vous pouvez obtenir des identifiants d'accès temporaires de l'une des deux manières suivantes :
-
Méthode 1
Appelez l'opération AssumeRole de STS.
-
Méthode 2
Utilisez un kit de développement logiciel (SDK) STS.
-
Utilisez les identifiants d'accès temporaires pour télécharger un fichier.
require 'aliyun/sts'
require 'aliyun/oss'
sts = Aliyun::STS::Client.new(
# Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Specify the ARN of the role and a custom session name.
token = sts.assume_role('role-arn', 'session-name')
client = Aliyun::OSS::Client.new(
# The China (Hangzhou) endpoint is used as an example. Specify the endpoint based on your actual region.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# The temporary AccessKey pair (AccessKey ID and AccessKey secret) obtained from STS.
access_key_id: 'token.access_key_id',
access_key_secret: 'token.access_key_secret',
# The security token obtained from STS.
sts_token: 'token.security_token')
# Specify the bucket name. For example, examplebucket.
bucket = client.get_bucket('examplebucket')
# Upload a file.
bucket.put_object('exampleobject.txt', :file => 'D:\\localpath\\examplefile.txt')
Utiliser une URL pré-signée pour l'autorisation temporaire
Notes
-
Lorsqu'un SDK génère une URL pré-signée, il utilise les informations de clé stockées localement pour calculer une signature selon un algorithme spécifique. Le SDK ajoute ensuite cette signature à l'URL afin d'en garantir la validité et la sécurité. Ce processus de calcul de la signature et de construction de l'URL s'effectue côté client et n'implique aucune requête réseau. Par conséquent, l'appelant n'a pas besoin de permissions spécifiques pour générer l'URL pré-signée. Toutefois, pour garantir que les utilisateurs tiers puissent effectuer les opérations prévues sur les ressources à l'aide de l'URL pré-signée, vous devez vous assurer que l'identité utilisée pour générer l'URL dispose des permissions requises.
Par exemple, pour télécharger ou prévisualiser un fichier à l'aide d'une URL pré-signée, l'autorisation oss:GetObject est requise.
Vous pouvez générer une URL pré-signée et la fournir à un visiteur pour un accès temporaire. Lors de la génération d'une URL pré-signée, vous pouvez spécifier sa durée de validité afin de limiter la période pendant laquelle le visiteur peut accéder à des données spécifiques.
Pour générer une URL pré-signée permettant d'accéder aux ressources via HTTPS, définissez le protocole dans le point de terminaison sur HTTPS.
L'URL pré-signée générée à l'aide de l'exemple de code suivant peut contenir un signe plus (
+). Dans ce cas, remplacez le signe plus (+) dans l'URL par%2B. Sinon, l'URL pré-signée risque de ne pas permettre d'accéder à l'objet comme prévu.
Générer une URL pré-signée et l'utiliser pour télécharger un fichier
-
Générez une URL pré-signée pour le téléchargement d'un fichier.
require 'aliyun/oss' client = Aliyun::OSS::Client.new( # The China (Hangzhou) endpoint is used as an example. Specify the endpoint based on your actual region. endpoint: 'https://oss-cn-hangzhou.aliyuncs.com', # Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. access_key_id: ENV['OSS_ACCESS_KEY_ID'], access_key_secret: ENV['OSS_ACCESS_KEY_SECRET'] ) # Specify the bucket name. For example, examplebucket. bucket = client.get_bucket('examplebucket') # Generate a presigned URL and set its validity period to 1 hour (3600 seconds). puts bucket.object_url('my-object', true, 3600) -
Téléchargez un objet à l'aide d'une URL signée sur des appareils mobiles ou dans des navigateurs.
// Enter the generated signed URL. String url = ""; OkHttpClient client = new OkHttpClient(); // Use the signed URL to download the object. Request getRequest = new Request.Builder() .url(url) .get() .build(); client.newCall(getRequest).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.code() == 203 || response.code() >= 300) { Log.d("download", "fail"); Log.d("download", response.body().string()); return; } // The object is downloaded. InputStream inputStream = response.body().byteStream(); byte[] buffer = new byte[2048]; int len; while ((len = inputStream.read(buffer)) != -1) { // Process the downloaded data. For example, display the image or perform a write operation on the object. } } });// Use the signed URL to download the object. NSURL * url = [NSURL URLWithString:urlString]; NSURLRequest * request = [NSURLRequest requestWithURL:url]; NSURLSession * session = [NSURLSession sharedSession]; NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"download error: %@", error); return; } else if (((NSHTTPURLResponse*)response).statusCode == 203 || ((NSHTTPURLResponse*)response).statusCode >= 300) { NSString *body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"download error: %@", body); return; } NSLog(@"download success"); }]; [sessionTask resume];// You can also use the download attribute in the <a> tag of an HTML page or window.open of a web API to obtain an object URL.
Références
Pour une description détaillée de l'utilisation et des paramètres relatifs à l'octroi d'un accès temporaire via STS, consultez la documentation API.
Pour plus d'informations sur l'ajout d'informations de signature à une URL et la fourniture de l'URL pré-signée à une tierce partie pour accorder un accès autorisé, consultez Version 1 de la signature.