AWS-Java SDK を介してブラウザの S3 アップロード リクエストに署名する

クリス・ターナー

EmberJS を使用して構築されたフロントエンド クライアント、特にember-uploaderを使用して、S3 へのファイルの直接アップロードを処理しました。私が行き詰まっているのは、Amazon に送信される前に、バックエンド サーバー (Java Dropwizard マイクロサービス) を使用してリクエストに正しく署名できないように見えることです。

を作成できることはわかっていますGeneratePresignedUrlRequestが、使用しているフロントエンド ライブラリでは、サーバーから json オブジェクトを返す必要があるため、それをGeneratePresignedUrlRequestオブジェクトに分割しようとしています。

現時点では問題ないように見えpolicyますが、正しく作成する方法をトレーニングできないため行方不明です

private SignRequestObject createSignRequestObject(List<NameValuePair> valuePairs) {
    SignRequestObject request = new SignRequestObject();

    request.setKey("test.txt");
    request.setBucket("test-bucket");
    request.setPolicy("?");

    for (NameValuePair pairs : valuePairs) {
        if (pairs.getName().equals("X-Amz-Credential")) {
            request.setCredentials(pairs.getValue());
        }

        if (pairs.getName().equals("X-Amz-Signature")) {
            request.setSignature(pairs.getValue());
        }

        if (pairs.getName().equals("X-Amz-Algorithm")) {
            request.setAlgorithm(pairs.getValue());
        }

        if (pairs.getName().equals("X-Amz-Date")) {
            request.setDate(pairs.getValue());
        }
    }

    return request;
}

valuePairs は GeneratePresignedUrlRequest

private String createSignedUrl() {
    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest("test-bucket", "test.txt");
    generatePresignedUrlRequest.setMethod(HttpMethod.PUT);

    return amazonS3.generatePresignedUrl(generatePresignedUrlRequest).toString();
}

ember-uploader のwikiよると、ポリシー オブジェクトは次のようになります。

// Ruby example, but shouldn't matter
        {
          expiration: @expires,
          conditions: [
            { bucket: 'sandbox' },
            { acl: 'public-read' },
            { expires: @expires },
            { success_action_status: '201' },
            [ 'starts-with', '$key', '' ],
            [ 'starts-with', '$Content-Type', '' ],
            [ 'starts-with', '$Cache-Control', '' ],
            [ 'content-length-range', 0, 524288000 ]
          ]
      )

これを自分で構築しようとする必要がありますか、それとも aws-sdk にこれのためのメソッドがありますか? AWS Signature Version 4あちこちていますが、使い方もわかりません。

ブラウザ経由でアップロードしようとすると、Amazon から 403 が返されます。

クリス・ターナー

私はこれを解決し、そのための小さな guice モジュールを作成しました。これは、バックエンドへの get リクエストで Repository クラスから呼び出されます。

// 資源

public class SignResource {

    private final SignRepository repository;

    @Inject
    public SignResource(SignRepository repository) {
        this.repository = repository;
    }

    @GET
    public Response signPOST(@QueryParam("type") String type) {
        String signRequest = repository.signRequest(type);
        return Response.status(Response.Status.OK).entity(signRequest).build();
    }
}

// リポジトリ

public class SignRepository {

    @Inject
    private SignService signService;

    public SignRepository() {
    }

    public String signRequest(String contentType) {
        return signService.signRequest(contentType);
    }
}

// 実装

public class SignServiceImpl implements SignService {

    private String awsBucket;
    private String awsAccessKey;
    private String awsSecretKey;

    SignServiceImpl(AmazonConfiguration amazon) {
        awsSecretKey = amazon.getSecret();
        awsAccessKey = amazon.getAccess();
        awsBucket = amazon.getBucket();
    }

    @Override
    public String signRequest(String contentType) {
        final String randomFileName = createRandomName();

        String policy = createPolicy(randomFileName, contentType);

        SignRequest signRequest = new SignRequest();
        signRequest.setAwsAccessKeyId(awsAccessKey);
        signRequest.setPolicy(policy);
        signRequest.setSignature(ServiceUtils.signWithHmacSha1(awsSecretKey, policy));
        signRequest.setBucket(awsBucket);
        signRequest.setKey(randomFileName);
        signRequest.setAcl("public-read");
        signRequest.setContentType(contentType);
        signRequest.setExpires(createExpireTime().toString());
        signRequest.setSuccessActionStatus("201");

        return createJsonString(signRequest);
    }

    private String createPolicy(String randomFileName, String contentType) {
        try {
            String[] conditions = {
                S3Service.generatePostPolicyCondition_Equality("bucket", awsBucket),
                S3Service.generatePostPolicyCondition_Equality("key", randomFileName),
                S3Service.generatePostPolicyCondition_Equality("acl", "public-read"),
                S3Service.generatePostPolicyCondition_Equality("expires", createExpireTime().toString()),
                S3Service.generatePostPolicyCondition_Equality("content-Type", contentType),
                S3Service.generatePostPolicyCondition_Equality("success_action_status", "201"),
                S3Service.generatePostPolicyCondition_AllowAnyValue("cache-control")
            };

            String policyDocument = "{\"expiration\": \"" + ServiceUtils.formatIso8601Date(createExpireTime()) + "\", \"conditions\": [" + ServiceUtils.join(conditions, ",") + "]}";

            return ServiceUtils.toBase64(policyDocument.getBytes(Constants.DEFAULT_ENCODING));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return null;
    }

    private String createRandomName() {
        return UUID.randomUUID().toString();
    }

    private Date createExpireTime() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR, 24);

        return cal.getTime();
    }

    private String createJsonString(SignRequest request) {
        ObjectMapper mapper = new ObjectMapper();
        String json = null;

        try {
            json = mapper.writeValueAsString(request);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return json;
    }
}

// サービス

public interface SignService {
    String signRequest(String contentType);
}

// モジュール

public class SignServiceModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(SignService.class).toProvider(SignServiceProvider.class).asEagerSingleton();
    }
}

// プロバイダー

public class SignServiceProvider implements Provider<SignService> {

    @Inject
    private SwordfishConfiguration configuration;

    @Override
    public SignService get() {
        return new SignServiceImpl(configuration.getAmazon());
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

aws-sdk-javaを使用してS3バケットにアップロード中にPermanentRedirectエラーが発生しました

分類Dev

空のサブフォルダーを含むフォルダーをS3にアップロードします(AWS Java SDKを使用)

分類Dev

AWS Java SDK 2 S3コピーオブジェクト

分類Dev

Java OutputStreamをAWS S3にアップロードする方法

分類Dev

aws Java SDKを介してS3オブジェクトをどのように公開しますか?

分類Dev

aws-sdk-goを使用してファイルを作成せずにオブジェクトをAWS S3にアップロードする

分類Dev

429 aws-sdkを使用してs3オブジェクトの署名付きURLを生成するときにリクエストが多すぎる

分類Dev

AWS Ruby SDK CORE:ファイルをS3にアップロードする

分類Dev

AWS C ++ SDKを使用したマルチパートアップロードS3

分類Dev

Java Apache HttpClientを使用してファイルをパブリックAWS S3バケットにアップロードする方法

分類Dev

Java Apache HttpClientを使用してファイルをパブリックAWS S3バケットにアップロードする方法

分類Dev

Java SDKを使用してQuicktimeビデオをS3にアップロードする

分類Dev

AWS-iOS-SDKを使用したs3スロットリングストリームのアップロード?

分類Dev

Java SDKを介してAWS S3でのアクセス許可をどのように決定しますか?

分類Dev

AWS S3 Java SDK-アクセス拒否

分類Dev

aws-sdkを使用してs3バケットに画像をアップロードすることでreact-native

分類Dev

AWS SDK for Node.jsを使用してバイナリファイルをS3にアップロードする

分類Dev

AWS PHP SDK:事前署名されたURLでS3ファイルのアップロードサイズを制限する

分類Dev

AWS S3 Javascript SDK を使用して新しいウェブページをロードする

分類Dev

AWS Java SDKを使用して既存のS3オブジェクトのExpiresヘッダーを設定する

分類Dev

AWS SDK for Javaバージョン2でのS3Exception-計算したリクエストの署名が、指定した署名と一致しません

分類Dev

aws-sdkを使用してファイルをS3に同期的にアップロードするにはどうすればよいですか?

分類Dev

Angular 2 / Javascript AWS S3SDK-アップロードを中止するonClick

分類Dev

Javaを使用してAWS S3 SDKのgetObjectメソッドを単体テストするにはどうすればよいですか?

分類Dev

ETagを使用せずにaws-java-sdk-s3でマルチパートアップロードを使用することは可能ですか?

分類Dev

[Node JS AWS SDK] IAMロールを想定したS3へのアップロード時に認証情報がありません

分類Dev

goを使用してAWS S3にファイルをアップロードするストリーム

分類Dev

JavaScript用のaws-sdkを使用して、iOSアプリ(Konyでビルド)からAWS S3にイメージをアップロードするにはどうすればよいですか?

分類Dev

AWS SDKを使用してS3ダウンロードの進行状況を監視できますか?

Related 関連記事

  1. 1

    aws-sdk-javaを使用してS3バケットにアップロード中にPermanentRedirectエラーが発生しました

  2. 2

    空のサブフォルダーを含むフォルダーをS3にアップロードします(AWS Java SDKを使用)

  3. 3

    AWS Java SDK 2 S3コピーオブジェクト

  4. 4

    Java OutputStreamをAWS S3にアップロードする方法

  5. 5

    aws Java SDKを介してS3オブジェクトをどのように公開しますか?

  6. 6

    aws-sdk-goを使用してファイルを作成せずにオブジェクトをAWS S3にアップロードする

  7. 7

    429 aws-sdkを使用してs3オブジェクトの署名付きURLを生成するときにリクエストが多すぎる

  8. 8

    AWS Ruby SDK CORE:ファイルをS3にアップロードする

  9. 9

    AWS C ++ SDKを使用したマルチパートアップロードS3

  10. 10

    Java Apache HttpClientを使用してファイルをパブリックAWS S3バケットにアップロードする方法

  11. 11

    Java Apache HttpClientを使用してファイルをパブリックAWS S3バケットにアップロードする方法

  12. 12

    Java SDKを使用してQuicktimeビデオをS3にアップロードする

  13. 13

    AWS-iOS-SDKを使用したs3スロットリングストリームのアップロード?

  14. 14

    Java SDKを介してAWS S3でのアクセス許可をどのように決定しますか?

  15. 15

    AWS S3 Java SDK-アクセス拒否

  16. 16

    aws-sdkを使用してs3バケットに画像をアップロードすることでreact-native

  17. 17

    AWS SDK for Node.jsを使用してバイナリファイルをS3にアップロードする

  18. 18

    AWS PHP SDK:事前署名されたURLでS3ファイルのアップロードサイズを制限する

  19. 19

    AWS S3 Javascript SDK を使用して新しいウェブページをロードする

  20. 20

    AWS Java SDKを使用して既存のS3オブジェクトのExpiresヘッダーを設定する

  21. 21

    AWS SDK for Javaバージョン2でのS3Exception-計算したリクエストの署名が、指定した署名と一致しません

  22. 22

    aws-sdkを使用してファイルをS3に同期的にアップロードするにはどうすればよいですか?

  23. 23

    Angular 2 / Javascript AWS S3SDK-アップロードを中止するonClick

  24. 24

    Javaを使用してAWS S3 SDKのgetObjectメソッドを単体テストするにはどうすればよいですか?

  25. 25

    ETagを使用せずにaws-java-sdk-s3でマルチパートアップロードを使用することは可能ですか?

  26. 26

    [Node JS AWS SDK] IAMロールを想定したS3へのアップロード時に認証情報がありません

  27. 27

    goを使用してAWS S3にファイルをアップロードするストリーム

  28. 28

    JavaScript用のaws-sdkを使用して、iOSアプリ(Konyでビルド)からAWS S3にイメージをアップロードするにはどうすればよいですか?

  29. 29

    AWS SDKを使用してS3ダウンロードの進行状況を監視できますか?

ホットタグ

アーカイブ