3

I'm getting an unexpected 403 with trying to upload a file to S3. The weird part is that I have accomplished this before when I did this using the Java AWS SDK to generate the presigned url. I am now using the Python AWS SDK to generate the presigned url and I feel like I am doing the exact same thing.

Here is my code that WORKS no problem:

public UploadSignedRequest getUploadSignedRequest() {

    AmazonS3 s3Client = getS3Client();

    // Set the pre-signed URL to expire after one hour.
    Date expiration = DateUtil.getSignedUrlExpirationDate();

    // Generate the pre-signed URL.
    String objectKey = UUID.randomUUID().toString();
    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(BUCKET_NAME, objectKey)
            .withMethod(HttpMethod.PUT)
            .withExpiration(expiration);
    String s3FilePath = String.format("%s/%s/%s", S3_URL, BUCKET_NAME, objectKey);
    URL signedRequest = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
    return new UploadSignedRequest(signedRequest, s3FilePath, objectKey);
}

Here is the successful client code:

var config = {
    onUploadProgress: function (progressEvent) {
        var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
        updateProgressFunc(percentCompleted);
    }
};
axios
    .put(signedRequest.signedRequestUrl, videoFile, config)
    .then(res => {
        console.log(res);
        console.log(res.status);
        // save video metadata in db
        dispatch(saveVideoMetadata(video));
    })
    .catch(function (error) {
        console.log(error);
    });

Now, here is me trying to accomplish essentially the same thing (image files instead of video files) using the Python AWS SDK.

def getS3UploadRequest(uuid):
return S3.generate_presigned_url(
    ClientMethod='put_object',
    Params={
        'Bucket': BUCKET,
        'Key': uuid
    }
)

client code where I get the 403:

        axios
            .put(signedRequest, attachedFile)
            .then(res => {
                console.log("successfully uploaded file to s3");
                console.log(res);
                // dispatch(createProjectTaskComment(newComment, projectTaskId, userId, isFreelancer));
            });

When I try to use the presignedUrl in postman, I get the following response back:

?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>gibberish</AWSAccessKeyId><StringToSign>PUT

Thanks for the help!!!

btbam91
  • 578
  • 2
  • 8
  • 20
  • Possible duplicate of https://stackoverflow.com/questions/52625812/boto3-generate-presigned-url-for-put-object-return-the-request-signature-we – jogold May 04 '19 at 18:40

0 Answers0