2016-08-08 1 views
1

아마존 S3 브라우저 기반 업로드를위한 첫 번째 장애물에서 실패한 것 같습니다.AWS에 대한 Base64Encode가 Amazon과 일치하지 않습니다. 예 :

아마존의 예는 여기에 표시된 사용 : http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

그루비/자바를 사용하여, 나는 예를 들어 포스트 정책을 인코딩하고 아마존과 같은 인코딩을 만들어 드릴 수 없습니다.

{ "expiration": "2015-12-30T12:00:00.000Z", 
    "conditions": [ 
    {"bucket": "sigv4examplebucket"}, 
    ["starts-with", "$key", "user/user1/"], 
    {"acl": "public-read"}, 
    {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"}, 
    ["starts-with", "$Content-Type", "image/"], 
    {"x-amz-meta-uuid": "14365123651274"}, 
    {"x-amz-server-side-encryption": "AES256"}, 
    ["starts-with", "$x-amz-meta-tag", ""], 

    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"}, 
    {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, 
    {"x-amz-date": "20151229T000000Z" } 
    ] 
} 

나는이 멋져요 멀티 라인 문자열로 정의했습니다 :

String policy_document = ''' 
{ "expiration": "2015-12-30T12:00:00.000Z", 
    "conditions": [ 
    {"bucket": "sigv4examplebucket"}, 
    ["starts-with", "$key", "user/user1/"], 
    {"acl": "public-read"}, 
    {"success_action_redirect": "http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html"}, 
    ["starts-with", "$Content-Type", "image/"], 
    {"x-amz-meta-uuid": "14365123651274"}, 
    {"x-amz-server-side-encryption": "AES256"}, 
    ["starts-with", "$x-amz-meta-tag", ""], 

    {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request"}, 
    {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, 
    {"x-amz-date": "20151229T000000Z" } 
    ] 
} 
''' 

나는 다음 인코딩 및 실패 어설으로 확인하고있다.

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLCAgImNvbmRpdGlvbnMiOiBbICAgIHsiYnVja2V0IjogInNpZ3Y0ZXhhbXBsZWJ1Y2tldCJ9LCAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwgICAgeyJhY2wiOiAicHVibGljLXJlYWQifSwgICAgeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vc2lndjRleGFtcGxlYnVja2V0LnMzLmFtYXpvbmF3cy5jb20vc3VjY2Vzc2Z1bF91cGxvYWQuaHRtbCJ9LCAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sICAgIHsieC1hbXotbWV0YS11dWlkIjogIjE0MzY1MTIzNjUxMjc0In0sICAgIHsieC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbiI6ICJBRVMyNTYifSwgICAgWyJzdG :

String base64Policy = (new BASE64Encoder()).encode(policy_document.replaceAll("\n", "").replaceAll("\r", "").getBytes("UTF-8")) 
assert 'eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9' == base64Policy 

그냥 내가 얻을 인코딩 할 때, 가독성에 도움 FydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sICAgIHsieC1hbXotY3JlZGVudGlhbCI6ICJBS0lBSU9TRk9ETk43RVhBTVBMRS8yMDE1MTIyOS91cy1lYXN0LTEvczMvYXdzNF9yZXF1ZXN0In0sICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwgICAgeyJ4LWFtei1kYXRlIjogIjIwMTUxMjI5VDAwMDAwMFoiIH0gIF19

그러나 나는 점점해야합니다

eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXR을

oIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9 나는 눈의 신선한 세트가 방향으로 날 가리 킵니다 바라고 있어요. 제안 할 수있는 조언에 대해 많은 감사드립니다.

답변

0

다음은 Java에서 잘되었습니다. 캐리지 리턴 및 줄 바꿈 위치는 그대로 두십시오.

String policy_document = "{ \"expiration\": \"2015-12-30T12:00:00.000Z\",\n" + 
      " \"conditions\": [\n" + 
      " {\"bucket\": \"sigv4examplebucket\"},\n" + 
      " [\"starts-with\", \"$key\", \"user/user1/\"],\n" + 
      " {\"acl\": \"public-read\"},\n" + 
      " {\"success_action_redirect\": \"http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html\"},\n" + 
      " [\"starts-with\", \"$Content-Type\", \"image/\"],\n" + 
      " {\"x-amz-meta-uuid\": \"14365123651274\"},\n" + 
      " {\"x-amz-server-side-encryption\": \"AES256\"},\n" + 
      " [\"starts-with\", \"$x-amz-meta-tag\", \"\"],\n" + 
      "\n" + 
      " {\"x-amz-credential\": \"AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request\"},\n" + 
      " {\"x-amz-algorithm\": \"AWS4-HMAC-SHA256\"},\n" + 
      " {\"x-amz-date\": \"20151229T000000Z\" }\n" + 
      " ]\n" + 
      "}"; 
    String base64Policy = (new BASE64Encoder()).encode(policy_document.getBytes()); 
+0

제안 해 주셔서 감사합니다.하지만 여전히 약간 다른 결과가 나타납니다. –

0

나를 올바른 방향으로 안내해 주셔서 감사합니다.

마지막 해결책은 각 줄의 끝에이 순서대로 \ r \ n을 추가하는 것입니다.

String policy_document = "{ \"expiration\": \"2015-12-30T12:00:00.000Z\",\r\n" + 
     " \"conditions\": [\r\n" + 
     " {\"bucket\": \"sigv4examplebucket\"},\r\n" + 
     " [\"starts-with\", \"$key\", \"user/user1/\"],\r\n" + 
     " {\"acl\": \"public-read\"},\r\n" + 
     " {\"success_action_redirect\": \"http://sigv4examplebucket.s3.amazonaws.com/successful_upload.html\"},\r\n" + 
     " [\"starts-with\", \"$Content-Type\", \"image/\"],\r\n" + 
     " {\"x-amz-meta-uuid\": \"14365123651274\"},\r\n" + 
     " {\"x-amz-server-side-encryption\": \"AES256\"},\r\n" + 
     " [\"starts-with\", \"$x-amz-meta-tag\", \"\"],\r\n" + 
     "\r\n" + 
     " {\"x-amz-credential\": \"AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request\"},\r\n" + 
     " {\"x-amz-algorithm\": \"AWS4-HMAC-SHA256\"},\r\n" + 
     " {\"x-amz-date\": \"20151229T000000Z\" }\r\n" + 
     " ]\r\n" + 
     "}"; 

이 너무 엄격하고 마크 업 청소기를 유지하기 위해이 작업을 수행 할 수없는 그루비 멀티 라인 문자열을 사용하는 것을 구현해야 할 것은 불행한 일입니다.

+1

창 개행 문자로 끝내지 않아도됩니다. 그것은 단지 예입니다. 입력에 맞게 기본 64 인코딩 만 있으면됩니다. –

+0

의견을 보내 주셔서 감사합니다. 네, 네가 맞다고 생각해. Groovy JSON을 사용하여 정책을 만들 수 있어야합니다. 그러나 다음 암호화 단계를 올바르게 수행하는지 확인하기 위해 암호화 단계에 대한 입력 역할을하므로이 인코딩에 대한 정확한 일치가 필요했습니다. –

+0

일단 전체 과정을 거치면이 질문을 반영하도록 노력하겠습니다. –

관련 문제