Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Créer un pré-signé URLs
Vous pouvez présigner des demandes pour certaines opérations AWS d'API afin qu'un autre appelant puisse utiliser la demande ultérieurement sans présenter ses propres informations d'identification.
Supposons par exemple que Jane ait accès à un objet Amazon Simple Storage Service (Amazon S3) et qu'elle souhaite partager temporairement l'accès à cet objet avec Alejandro. Jane peut générer une GetObject
demande présignée à partager avec Alejandro afin qu'il puisse télécharger l'objet sans avoir besoin d'accéder aux informations d'identification de Jane ou d'avoir les siennes. Les informations d'identification utilisées par l'URL présignée sont celles de Jane, car c'est elle AWS qui a généré l'URL.
Pour en savoir plus sur le présigné URLs dans Amazon S3, consultez la section Travailler avec le présigné URLs dans le guide de l'utilisateur d'Amazon Simple Storage Service.
Principes de base de la présignature
Kit AWS SDK pour Rust Il fournit une presigned()
méthode d'opération fluent-builders qui peut être utilisée pour obtenir une demande présignée.
L'exemple suivant crée une GetObject
demande présignée pour Amazon S3. La demande est valide pendant 5 minutes après sa création.
use std::time::Duration; use aws_config::BehaviorVersion; use aws_sdk_s3::presigning::PresigningConfig; let config = aws_config::defaults(BehaviorVersion::latest()) .load() .await; let s3 = aws_sdk_s3::Client::new(&config); let presigned = s3.get_object() .presigned( PresigningConfig::builder() .expires_in(Duration::from_secs(60 * 5)) .build() .expect("less than one week") ) .await?;
La presigned()
méthode renvoie unResult<PresignedRequest, SdkError<E, R>>
.
Le résultat PresignedRequest
contient des méthodes permettant d'accéder aux composants d'une requête HTTP, notamment la méthode, l'URI et les en-têtes éventuels. Tous ces éléments doivent être envoyés au service, le cas échéant, pour que la demande soit valide. Cependant, de nombreuses demandes présignées peuvent être représentées uniquement par l'URI.
Présignature POST
et demandes PUT
De nombreuses opérations présignables ne nécessitent qu'une URL et doivent être envoyées sous forme de requêtes HTTPGET
. Cependant, certaines opérations prennent un corps et doivent être envoyées sous forme de PUT
requête HTTP POST
ou HTTP avec des en-têtes dans certains cas. La présignature de ces demandes est identique à la présignature des GET
demandes, mais l'invocation de la demande présignée est plus compliquée.
Voici un exemple de présignature d'une demande Amazon S3 et de sa conversion en une PutObject
requête http::request::Request
Pour utiliser into_http_1x_request()
cette méthode, ajoutez la http-1x
fonctionnalité à votre aws-sdk-s3
caisse dans votre Cargo.toml
fichier :
aws-sdk-s3 = { version = "1", features = ["http-1x"] }
Fichier source :
let presigned = s3.put_object() .presigned( PresigningConfig::builder() .expires_in(Duration::from_secs(60 * 5)) .build() .expect("less than one week") ) .await?; let body = "Hello AWS SDK for Rust"; let http_req = presigned.into_http_1x_request(body);
Signataire autonome
Note
Il s'agit d'un cas d'utilisation avancé. Il n'est ni nécessaire ni recommandé pour la plupart des utilisateurs.
Dans certains cas d'utilisation, il est nécessaire de créer une demande signée en dehors du contexte du SDK pour Rust. Pour cela, vous pouvez utiliser la aws-sigv4
Voici un exemple illustrant les éléments de base. Consultez la documentation relative à la caisse pour plus de détails.
Ajoutez les http
caisses aws-sigv4
et à votre Cargo.toml
fichier :
[dependencies] aws-sigv4 = "1" http = "1"
Fichier source :
use aws_smithy_runtime_api::client::identity::Identity; use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest}; use aws_sigv4::sign::v4; use std::time::SystemTime; // Set up information and settings for the signing. // You can obtain credentials from `SdkConfig`. let identity = Credentials::new( "AKIDEXAMPLE", "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", None, None, "hardcoded-credentials").into(); let settings = SigningSettings::default(); let params = v4::SigningParams::builder() .identity(&identity) .region("us-east-1") .name("service") .time(SystemTime::now()) .settings(settings) .build()? .into(); // Convert the HTTP request into a signable request. let signable = SignableRequest::new( "GET", "https://some-endpoint.some-region.amazonaws.com", std::iter::empty(), SignableBody::UnsignedPayload )?; // Sign and then apply the signature to the request. let (signing_instructions, _signature) = sign(signable, ¶ms)?.into_parts(); let mut my_req = http::Request::new("..."); signing_instructions.apply_to_request_http1x(&mut my_req);