

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 建立預先簽章URLs 適用於 Rust 的 AWS SDK
<a name="presigned-urls"></a>

 您可以為某些 AWS API 操作預先簽署請求，以便其他發起人稍後可以使用該請求，而無需出示自己的登入資料。

 例如，假設 Jane 可以存取 Amazon Simple Storage Service (Amazon S3) 物件，而且她想要暫時與 Alejandro 共用物件存取。Jane 可以產生預先簽章的`GetObject`請求來與 Alejandro 共用，因此他可以下載物件，而不需要存取 Jane 的登入資料或擁有自己的任何登入資料。預先簽章 URL 使用的登入資料是 Jane 的 ，因為她是產生 URL AWS 的使用者。

若要進一步了解 Amazon S3 中預先簽章URLs，請參閱《*Amazon Simple Storage Service 使用者指南*》中的[使用預先簽章URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html)。

## 預先簽章基本概念
<a name="presign-basics"></a>

 適用於 Rust 的 AWS SDK 提供操作流暢建置器`presigned()`的方法，可用來取得預先簽章的請求。

 下列範例會建立 Amazon S3 的預先簽章`GetObject`請求。請求在建立後 5 分鐘內有效。

```
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?;
```

 `presigned()` 方法會傳回 `Result<PresignedRequest, SdkError<E, R>>`。

傳回的 `PresignedRequest`包含可在 HTTP 請求元件取得的方法，包括方法、URI 和任何標頭。所有這些都需要傳送到 服務，如果有的話，請求才有效。不過，許多預先簽章的請求可以單獨由 URI 表示。

## 預先簽章`POST`和`PUT`請求
<a name="presign-post-put"></a>

 許多可預先簽章的操作只需要 URL，而且必須以 HTTP `GET`請求傳送。不過，某些操作會採用內文，在某些情況下，必須以 HTTP `POST`或 HTTP `PUT`請求與標頭一起傳送。預先簽章這些請求與預先簽章`GET`請求相同，但調用預先簽章請求更為複雜。

 以下是預先簽署 Amazon S3 `PutObject`請求並將其轉換為 的範例[https://docs.rs/http/latest/http/request/struct.Request.html](https://docs.rs/http/latest/http/request/struct.Request.html)，該請求可以使用您選擇的 HTTP 用戶端傳送。

若要使用 `into_http_1x_request()`方法，請將 `http-1x`功能新增至 `Cargo.toml` 檔案中的`aws-sdk-s3`木箱：

```
aws-sdk-s3 = { version = "1", features = ["http-1x"] }
```

來源檔案：

```
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);
```

## 獨立簽署者
<a name="standalone-signer"></a>

**注意**  
這是進階使用案例。大多數使用者不需要或建議這樣做。

有幾個使用案例需要建立 SDK for Rust 內容之外的已簽署請求。對於 ，您可以獨立於 SDK 使用 [https://docs.rs/aws-sigv4/latest/aws_sigv4/index.html](https://docs.rs/aws-sigv4/latest/aws_sigv4/index.html) 木箱。

 以下是示範基本元素的範例，如需詳細資訊，請參閱 木箱文件。

將 `aws-sigv4`和 `http` 條板箱新增至您的 `Cargo.toml` 檔案：

```
[dependencies]
aws-sigv4 = "1"
http = "1"
```

來源檔案：

```
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, &params)?.into_parts();

let mut my_req = http::Request::new("...");
signing_instructions.apply_to_request_http1x(&mut my_req);
```