2

カスタムリクエストヘッダーを使用する必要があることを理解しているため、いくつかのユーザーデータを含む署名付きURLを生成しようとしています

GeneratePresignedUrlRequest generatePresignedUrlRequest =
    new GeneratePresignedUrlRequest(bucket, objectKey)
        .withMethod(httpMethod)
        .withExpiration(expiration);
if (params != null) {
  params.forEach(
      (k, v) ->
          generatePresignedUrlRequest.putCustomRequestHeader(
              Headers.S3_USER_METADATA_PREFIX + k.toLowerCase(), v));
}
return s3.generatePresignedUrl(generatePresignedUrlRequest);

生成された URL の消費者はヘッダーを設定する必要がありますが。これらのヘッダーを追加するように消費者に強制する方法はありますか? 例: 必要なヘッダー (カスタム) が存在しない場合、Bad Request (400) をスローします。

4

1 に答える 1

2

addRequestParameterを調べましたか? これにより、クエリ文字列パラメーターが追加され、それらのパラメーターがないとリクエストは失敗します。

例えば

generatePresignedUrlRequest.addRequestParameter(Headers.S3_USER_METADATA_PREFIX + "test", "true");

生成された URL には、次のパラメーターが含まれます。

https://aws-domain/file.ext?x-amz-meta-test=true&X-Amz-Security-Token=<TOKEN>

アップデート:

Node.js でgetSignedUrl APIを使用して、クエリ文字列パラメーターでユーザー メタデータを使用して署名付き URL を生成しています。私は Java 開発者ではないためaddRequestParameter、メソッドで提供されたメタデータを使用して署名付き URL を生成するように見えるものを使用することを提案しました。

Node.js コード

const url = s3.getSignedUrl('putObject', {
  'Bucket': 'my-bucket',
  'Key': 'signed.json',
  'Metadata': {
    'my-id': '1234'
  }
});

署名付き URL :

https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=1234

ファイルのアップロード:

curl -k -X PUT -T "signed.json" "https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=1234"

ユーザー メタデータ:

ここに画像の説明を入力

クライアントは、ユーザー メタデータを追加できるようにするためにヘッダーを追加する必要はありません。クライアントが x-amz-meta-* を変更または削除しようとすると、SignatureDoesNotMatchまさに必要なものが得られます。

x-amz-meta-my-id を変更する

curl -k -X PUT -T "signed.json" "https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=123"

予想されるエラー:

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAJ5PO6T7F772ZPSPQ</AWSAccessKeyId>
于 2019-02-06T11:32:09.883 に答える