

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 预签名请求
<a name="presign-requests"></a>

您可以对某些 AWS API 操作的请求进行预签名，以便其他调用者以后无需出示自己的凭证即可使用该请求。

例如，假设 Alice 有权访问亚马逊简单存储服务 (Amazon S3) Service 对象，并且她想临时与 Bob 共享对象访问权限。Alice 可以生成与 Bob 共享的预签名`GetObject`请求，这样他就可以下载对象，而无需访问 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 中，每种可以预签名请求的方法都有一个重载，您可以使用它来提供高级配置选项，例如特定的签名者实现或详细的签名参数。

以下示例显示了一个 Amazon S3 `GetObject` 请求，该请求使用 CRT 签名者变体并指定了未来的签名日期。

```
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 和标头，必须包含在 future 的 HTTP 请求调用中。您可以将此请求传递给调用方，调用者可以在不同的代码库或编程语言环境中执行该请求。

创建预签名 POST 或 PUT 请求后，使用 HTTP 客户端调用请求。调用 POST 或 PUT 请求网址的 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()
```

## SDK 可以预签名的操作
<a name="presign-ops-supported"></a>

适用于 Kotlin 的 SDK 目前支持预签名以下 API 操作，这些操作需要使用关联的 HTTP 方法调用。


| 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 P | 
| 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 P | 
| AWS Security Token Service | GetCallerIdentity | [presignGetCaller身份](https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/sts/aws.sdk.kotlin.services.sts.presigners/presign-get-caller-identity.html) | HTTP 文章 | 
| 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 文章 | 