

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

# 預先簽章請求
<a name="presign-requests"></a>

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

例如，假設 Alice 可以存取 Amazon Simple Storage Service (Amazon S3) 物件，而且她想要暫時與 Bob 共用物件存取。Alice 可以產生預先簽章的`GetObject`請求來與 Bob 共用，以便他可以下載物件，而無需存取 Alice 的登入資料。

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

適用於 Kotlin 的 SDK 在服務用戶端上提供用於預先簽署請求的延伸方法。所有預先簽章的請求都需要代表已簽署請求有效時間長度的持續時間。持續時間結束後，預先簽章的請求會過期，並在執行時引發身分驗證錯誤。

下列程式碼顯示為 Amazon S3 建立預先簽章`GetObject`請求的範例。請求在建立後 24 小時內有效。

```
val s3 = S3Client.fromEnvironment()

val unsignedRequest = GetObjectRequest {
    bucket = "foo"
    key = "bar"
}

val presignedRequest = s3.presignGetObject(unsignedRequest, 24.hours)
```

[https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.presigners/presign-get-object.html](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.presigners/presign-get-object.html) 延伸項目方法會傳回 [https://docs.aws.amazon.com/smithy-kotlin/api/latest/http/aws.smithy.kotlin.runtime.http.request/-http-request/index.html](https://docs.aws.amazon.com/smithy-kotlin/api/latest/http/aws.smithy.kotlin.runtime.http.request/-http-request/index.html) 物件。請求物件包含可叫用操作的預先簽章 URL。另一個呼叫者可以在不同的程式碼庫或程式設計語言環境中使用 URL （或整個請求）。

建立預先簽章的請求之後，請使用 HTTP 用戶端來叫用請求。叫用 HTTP GET 請求的 API 取決於 HTTP 用戶端。下列範例使用 Kotlin [https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.net.-u-r-l/read-text.html](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.net.-u-r-l/read-text.html)方法。

```
val objectContents = URL(presignedRequest.url.toString()).readText()
println(objectContents)
```

## 進階預先簽章組態
<a name="presign-requests-conf-advanced"></a>

在 SDK 中，每個可以預先簽署請求的方法都有過載，您可以用來提供進階組態選項，例如特定的簽署者實作或詳細的簽署參數。

下列範例顯示使用 CRT 簽署者變體並指定未來簽署日期的 Amazon S3 `GetObject`請求。

```
val s3 = S3Client.fromEnvironment()

val unsignedRequest = GetObjectRequest {
    bucket = "foo"
    key = "bar"
}

val presignedRequest = s3.presignGetObject(unsignedRequest, signer = CrtAwsSigner) {
    signingDate = Instant.now() + 24.hours
    expiresAfter = 8.hours
}
```

傳回的預先簽章請求 24 小時前為轉寄日期，在此之前無效。它在那之後 8 小時過期。

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

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

以下是預先簽署 S3 `PutObject`請求的範例：

```
val s3 = S3Client.fromEnvironment()

val unsignedRequest = PutObjectRequest {
    bucket = "foo"
    key = "bar"
}

val presignedRequest = s3.presignPutObject(unsignedRequest, 24.hours)
```

傳回的方法值`HttpRequest`為 ，`HttpMethod.PUT`並包含 URL 和標頭，該 URL 和標頭必須包含在 HTTP 請求的未來調用中。您可以將此請求傳遞給可在不同程式碼庫或程式設計語言環境中執行請求的發起人。

建立預先簽章的 POST 或 PUT 請求之後，請使用 HTTP 用戶端來叫用請求。叫用 POST 或 PUT 請求 URL 的 API 取決於使用的 HTTP 用戶端。下列範例使用 [OkHttp HTTP 用戶端](https://square.github.io/okhttp)，並包含包含 的內文`Hello world`。

```
val putRequest = Request
    .Builder()
    .url(presignedRequest.url.toString())
    .apply {
        presignedRequest.headers.forEach { key, values ->
            header(key, values.joinToString(", "))
        }
    }
    .put("Hello world".toRequestBody())
    .build()

val response = okHttp.newCall(putRequest).execute()
```

## 軟體開發套件可以預先簽署的操作
<a name="presign-ops-supported"></a>

適用於 Kotlin 的 SDK 目前支援預先簽署以下需要使用相關聯 HTTP 方法呼叫的 API 操作。


| AWS 服務 | 作業 | SDK 擴充功能方法 | 使用 HTTP 方法 | 
| --- | --- | --- | --- | 
| Amazon S3 | GetObject | [presignGetObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.presigners/presign-get-object.html) |  HTTP GET  | 
| Amazon S3 | PutObject | [presignPutObject](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.presigners/presign-put-object.html) |  HTTP PUT  | 
| Amazon S3 | UploadPart |  [presignUploadPart](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/s3/aws.sdk.kotlin.services.s3.presigners/presign-upload-part.html)  |  HTTP PUT  | 
| AWS Security Token Service | GetCallerIdentity |  [presignGetCallerIdentity](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/sts/aws.sdk.kotlin.services.sts.presigners/presign-get-caller-identity.html)  |  HTTP POST  | 
| Amazon Polly | SynthesizeSpeech |  [presignSynthesizeSpeech](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/polly/aws.sdk.kotlin.services.polly.presigners/presign-synthesize-speech.html)  |  HTTP POST  | 