2017-09-12 3 views
1

아마존의 S3 스토리지를 사용할 애플리케이션을 개발 중입니다. Amazon에서 제공하는 자습서 및 예제를 따른 후에도 여전히 업로드가 제대로 작동하지 않습니다. 다음 메시지가 나타납니다. The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256. 버킷의 이름은 testbucket-10.09.2017이며 Frankfurt (eu-central-1) 영역에 있습니다. 나는 심지어 내가 필요로하는 것을 정확하게한다고 주장하는 application을 발견했다. 그러나 오류 메시지는 동일하다. 아래의 코드는 AWS에서 제공하는 문서 및 자습서에서 가져온 것입니다. 어떤 도움이라도 대단히 감사하겠습니다. 여기 HTTP POST를 사용하여 S3 버킷에 파일 업로드

내가 사용하고있는 코드입니다 :

내 HTML 양식 :

<html> 
    <head> 
    <title>S3 POST Form</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    </head> 

    <body> 
    <form action="https://testbucket-10.09.2017.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 
     <input type="hidden" name="key" value="uploads/${filename}"> 
     <input type="hidden" name="AWSAccessKeyId" value="REMOVED FOR SAFETY"> 
     <input type="hidden" name="acl" value="private"> 
     <input type="hidden" name="success_action_redirect" value="http://localhost/"> 
     <input type="hidden" name="policy" value="ZXlKbGVIQnBjbUYwYVc5dUlqb2dJakl3TVRndE1ERXRNREZVTURBNk1EQTZNREJhSWl3S0lDQWlZMjl1WkdsMGFXOXVjeUk2SUZzZ0NpQWdJQ0I3SW1KMVkydGxkQ0k2SUNKMFpYTjBZblZqYTJWMExURXdMakE1TGpJd01UY2lmU3dnQ2lBZ0lDQmJJbk4wWVhKMGN5MTNhWFJvSWl3Z0lpUnJaWGtpTENBaWRYQnNiMkZrY3k4aVhTd0tJQ0FnSUhzaVlXTnNJam9nSW5CeWFYWmhkR1VpZlN3S0lDQWdJSHNpYzNWalkyVnpjMTloWTNScGIyNWZjbVZrYVhKbFkzUWlPaUFpYUhSMGNEb3ZMMnh2WTJGc2FHOXpkQzhpZlN3S0lDQWdJRnNpYzNSaGNuUnpMWGRwZEdnaUxDQWlKRU52Ym5SbGJuUXRWSGx3WlNJc0lDSWlYU3dLSUNBZ0lGc2lZMjl1ZEdWdWRDMXNaVzVuZEdndGNtRnVaMlVpTENBd0xDQXhNRFE0TlRjMlhRb2dJRjBLZlE9PQ=="> 
     <input type="hidden" name="signature" value="REMOVED FOR SAFETY"> 
     <input type="hidden" name="Content-Type" value="image/jpeg"> 
     <!-- Include any additional input fields here --> 

     File to upload to S3: 
     <input name="file" type="file"> 
     <br> 
     <input type="submit" value="Upload File to S3"> 
    </form> 
    </body> 
</html> 

정책 및 서명 생성 내 자바 코드 :

public static void myAttempt() throws Exception { 

     String policy_document = constructPolicy(); 
     String aws_secret_key="REMOVED FOR SAFETY"; 

     String policy = (new BASE64Encoder()).encode(
       policy_document.getBytes("UTF-8")).replaceAll("\n","").replaceAll("\r",""); 

     String dateStamp ="20170912"; 
     String region = "eu-central-1"; 
     String serviceName ="s3"; 
     System.out.println("NEW SIGNATURE: "+getSignature(getSignatureKey(aws_secret_key,dateStamp,region,serviceName))); 

     System.out.println("ENCODED POLICY: "+policy);   
    } 

private static String constructPolicy() throws UnsupportedEncodingException { 

     String policy_document="{\"expiration\": \"2018-01-01T00:00:00Z\",\n" + 
       " \"conditions\": [ \n" + 
       " {\"bucket\": \"testbucket-10.09.2017\"}, \n" + 
       " [\"starts-with\", \"$key\", \"uploads/\"],\n" + 
       " {\"acl\": \"private\"},\n" + 
       " {\"success_action_redirect\": \"http://localhost/\"},\n" + 
       " [\"starts-with\", \"$Content-Type\", \"\"],\n" + 
       " [\"content-length-range\", 0, 1048576]\n" + 
       " ]\n" + 
       "}"; 

     String policy = (new BASE64Encoder()).encode(
       policy_document.getBytes("UTF-8")).replaceAll("\n","").replaceAll("\r",""); 
     return policy; 
    } 

private static byte[] HmacSHA256(String data, byte[] key) throws Exception { 
     String algorithm="HmacSHA256"; 
     Mac mac = Mac.getInstance(algorithm); 
     mac.init(new SecretKeySpec(key, algorithm)); 
     return mac.doFinal(data.getBytes("UTF8")); 
    } 

private static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception { 
     byte[] kSecret = ("AWS4" + key).getBytes("UTF8"); 
     byte[] kDate = HmacSHA256(dateStamp, kSecret); 
     byte[] kRegion = HmacSHA256(regionName, kDate); 
     byte[] kService = HmacSHA256(serviceName, kRegion); 
     byte[] kSigning = HmacSHA256("aws4_request", kService); 
     return kSigning; 
    } 

private static String getSignature(byte[] key) throws Exception{ 

     return base16().lowerCase().encode(HmacSHA256(constructPolicy(), key)); 
    } 
+4

API로 직접 작업하지 않는 한 [Java AWS SDK] (https://aws.amazon.com/sdk-for-java/)를 사용하는 것이 좋습니다. – birryree

+0

파일을 백엔드 (Java)로 보내고 거기에서 업로드한다는 의미입니까? – Syn

답변

1

가 있음을 밝혀 오래된 몇 가지 이유 AWS 문서 및 예제는 검색을 수행 할 때 가장 먼저 나온 결과 중 하나입니다. 나중에 몇 가지 Google 결과 페이지에 최신 예제가 나타납니다. 기본적으로 내가 사용하고있는 양식은 잘못되었습니다.

<html> 
    <head> 

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

    </head> 
    <body> 

    <form action="http://sigv4examplebucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 
    Key to upload: 
    <input type="input" name="key" value="user/user1/${filename}" /><br /> 
    <input type="hidden" name="acl" value="public-read" /> 
    <input type="hidden" name="success_action_redirect" value="http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html" /> 
    Content-Type: 
    <input type="input" name="Content-Type" value="image/jpeg" /><br /> 
    <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" /> 
    <input type="hidden" name="x-amz-server-side-encryption" value="AES256" /> 
    <input type="text" name="X-Amz-Credential" value="AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request" /> 
    <input type="text" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
    <input type="text" name="X-Amz-Date" value="20151229T000000Z" /> 

    Tags for File: 
    <input type="input" name="x-amz-meta-tag" value="" /><br /> 
    <input type="hidden" name="Policy" value='<Base64-encoded policy string>' /> 
    <input type="hidden" name="X-Amz-Signature" value="<signature-value>" /> 
    File: 
    <input type="file" name="file" /> <br /> 
    <!-- The elements after this will be ignored --> 
    <input type="submit" name="submit" value="Upload to Amazon S3" /> 
    </form> 

</html> 

Here 내가 양식을 가지고 및 추가 예제는 어디에서 찾을 수있는 위치에서 링크입니다 : 다음과 같이 올바른입니다.

관련 문제