

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 事前署名リクエスト
<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>

SDK for Kotlin は、リクエストに事前署名するための拡張メソッドをサービスクライアントに提供します。すべての署名付きリクエストには、署名付きリクエストが有効である期間を表す期間が必要です。期間が終了すると、署名付きリクエストは期限切れになり、実行されると認証エラーが発生します。

次のコードは、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`で、HTTP リクエストの今後の呼び出しに含める必要がある URL とヘッダーが含まれています。このリクエストは、別のコードベースまたはプログラミング言語環境で実行できる発信者に渡すことができます。

署名付き 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()
```

## SDK が事前署名できるオペレーション
<a name="presign-ops-supported"></a>

SDK for Kotlin は現在、関連付けられた 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  | 