아마존의 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));
}
API로 직접 작업하지 않는 한 [Java AWS SDK] (https://aws.amazon.com/sdk-for-java/)를 사용하는 것이 좋습니다. – birryree
파일을 백엔드 (Java)로 보내고 거기에서 업로드한다는 의미입니까? – Syn