Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Crear prefirmado URLs
Puedes prefirmar las solicitudes de algunas operaciones de la AWS API para que otra persona que llame pueda utilizar la solicitud más adelante sin tener que presentar sus propias credenciales.
Por ejemplo, supongamos que Jane tiene acceso a un objeto del Amazon Simple Storage Service (Amazon S3) y quiere compartir temporalmente el acceso al objeto con Alejandro. Jane puede generar una GetObject
solicitud prefirmada para compartirla con Alejandro para que pueda descargar el objeto sin necesidad de acceder a las credenciales de Jane ni tener ninguna propia. Las credenciales que utiliza la URL prefirmada son de Jane porque es el AWS usuario que generó la URL.
Para obtener más información sobre presigned URLs en Amazon S3, consulte Trabajar con presigned URLs en la Guía del usuario de Amazon Simple Storage Service.
Conceptos básicos sobre la prefirma
AWS SDK para Rust Proporciona un presigned()
método de construcción fluida de operaciones que se puede utilizar para obtener una solicitud prefirmada.
En el siguiente ejemplo, se crea una GetObject
solicitud prefirmada para Amazon S3. La solicitud es válida durante 5 minutos después de su creación.
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?;
El presigned()
método devuelve unResult<PresignedRequest, SdkError<E, R>>
.
El resultado PresignedRequest
contiene métodos para acceder a los componentes de una solicitud HTTP, incluidos el método, el URI y cualquier encabezado. Todos estos deben enviarse al servicio, si están presentes, para que la solicitud sea válida. Sin embargo, muchas solicitudes prefirmadas se pueden representar únicamente mediante la URI.
Firma previa POST
y solicitudes PUT
Muchas operaciones que se pueden prefirmar solo requieren una URL y deben enviarse como solicitudes HTTP. GET
Sin embargo, algunas operaciones ocupan un cuerpo y, en algunos casos, deben enviarse como una PUT
solicitud HTTP POST
o HTTP junto con encabezados. Prefirmar estas solicitudes es idéntico a prefirmar GET
las solicitudes, pero invocar la solicitud prefirmada es más complicado.
El siguiente es un ejemplo de prefirmar una PutObject
solicitud de Amazon S3 y convertirla en una http::request::Request
Para usar into_http_1x_request()
este método, añada la http-1x
función a la aws-sdk-s3
caja del archivoCargo.toml
:
aws-sdk-s3 = { version = "1", features = ["http-1x"] }
Archivo fuente:
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);
Firmante independiente
nota
Se trata de un caso de uso avanzado. No es necesario ni recomendado para la mayoría de los usuarios.
Hay algunos casos de uso en los que es necesario crear una solicitud firmada fuera del contexto del SDK para Rust. Para ello, puedes utilizar la aws-sigv4
El siguiente es un ejemplo para demostrar los elementos básicos; consulte la documentación de la caja para obtener más información.
Añada las http
cajas aws-sigv4
y cajas a su Cargo.toml
archivo:
[dependencies] aws-sigv4 = "1" http = "1"
Archivo fuente:
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);