AWS S3 Post Object ปฏิเสธฟิลด์แบบฟอร์มพิเศษ

Nov 24 2020

ฉันกำลังพยายามตั้งค่าระดับการจัดเก็บของรูปภาพที่อัปโหลดเป็นที่เก็บข้อมูล AWS S3 ฉันใช้งานได้ยกเว้นการเพิ่มคลาสพื้นที่เก็บข้อมูลในคำขอ S3 โพสต์เอกสารประกอบของวัตถุกล่าวจะมีข้อมูลใส่แบบฟอร์มชื่อ "X-AMZ จัดเก็บข้อมูลระดับ" แต่การเพิ่มหรือสาขาอื่น ๆ โยนข้อผิดพลาด AWS แสดงให้เห็นว่ามีช่องใส่มากเกินไปสำหรับการโพสต์ ฉันพยายามเพิ่มลงในนโยบายวัตถุ แต่ทำให้เกิดข้อผิดพลาดของนโยบาย: "เงื่อนไขของนโยบายล้มเหลว: [“ eq”,“ $ x-amz-storage-class”,“ ONEZONE_IA”]" ฉันใช้ JSP และช่องป้อนข้อมูลของแบบฟอร์มแสดงอยู่ด้านล่าง ความช่วยเหลือใด ๆ จะได้รับการชื่นชม

<input type="hidden" name="key" value="<%= imageFileName %>">
<input type="hidden" name="AWSAccessKeyId" value="<%= S3AccessKeyId %>"> 
<input type="hidden" name="acl" value="private"> 
<input type="hidden" name="success_action_redirect" value="<%= s3SuccessAction %>">
<input type="hidden" name="policy" value="<%= encPolicy %>" >
<input type="hidden" name="signature" value="<%= signature %>" >
<input type="hidden" name="Content-Type" value="image/jpeg">
<input type="hidden" name="x-amz-storage-class" value="ONEZONE_IA">   ***** CAUSES ERROR ****

ข้อผิดพลาด:

Invalid according to Policy: Policy Condition failed: [“eq”, “$x-amz-storage-class”, “STANDARD_IA”]

<Error>
<Code>AccessDenied</Code>
<Message>
Invalid according to Policy: Extra input fields: x-amz-storage-class
</Message>
<RequestId>1104FC046523752C</RequestId>
<HostId>
m0xPpMKJqBG6kZsdQfl/RY92dHprnvtGtrijHLqVtieM51ew+Mkp0mXGbTwKM7OsoUq6ZZUVIc0=
</HostId>
</Error>

คำตอบ

glez Nov 24 2020 at 05:56

ฉันทำงานนี้ได้แล้ว นโยบายมีเขตข้อมูลที่ต้องตรงกับเขตข้อมูลบนแบบฟอร์ม "x-amz-storage-class" จะต้องถูกเพิ่มลงในทั้งช่องฟอร์มและนโยบาย ฉันเดาว่านโยบายที่เข้ารหัสถูกลงนามด้วยเหตุผลด้านความปลอดภัยซึ่งทำให้ปลอดภัยและฟิลด์แบบฟอร์มต้องตรงกับฟิลด์นโยบายเพื่อให้แน่ใจว่าจะไม่มีการเปลี่ยนแปลง ทำไมทั้งคู่ถึงต้องการมากกว่าฉัน รหัสที่แก้ไขอยู่ด้านล่าง:

<fieldset>

    <input type="hidden" name="key" value="<%= imageFileName %>">
    <input type="hidden" name="AWSAccessKeyId" value="<%= S3AccessKeyId %>"> 
    <input type="hidden" name="acl" value="private"> 
    <input type="hidden" name="success_action_redirect" value="<%= s3SuccessAction %>">
    <input type="hidden" name="policy" value="<%= encPolicy %>" >
    <input type="hidden" name="signature" value="<%= signature %>" >
    <input type="hidden" name="Content-Type" value="image/jpeg">
    <input type="hidden" name="x-amz-storage-class" value="ONEZONE_IA">
    

public static String encodeS3Policy(String s3SuccessAction, String bucket) throws Exception
{
    String policy =
        "{\"expiration\": \"2040-01-01T00:00:00Z\"," +
          "\"conditions\": [" +
            "{\"bucket\": \"" + bucket + "\"}," +
            "[\"starts-with\", \"$key\", \"\"]," + "{\"acl\": \"private\"}," + "{\"success_action_redirect\": \"" + s3SuccessAction + "\"}," + "[\"starts-with\", \"$Content-Type\", \"\"]," +
            "{\"x-amz-storage-class\": \"ONEZONE_IA\"}," +
            "[\"content-length-range\", 0, 10485760]" +                                 // 10 MB max file up load
            "]" +
        "}";

    policy.replaceAll("\n","").replaceAll("\r","");


    // Encode the policy
    String encPolicy = Base64.getEncoder().encodeToString(policy.getBytes("UTF-8"));

    return encPolicy;
}

เพื่อความสมบูรณ์และเนื่องจากไม่ชัดเจนค่าคลาสการจัดเก็บคือ:

Default: STANDARD

STANDARD | REDUCED_REDUNDANCY | GLACIER | STANDARD_IA | ONEZONE_IA | INTELLIGENT_TIERING | DEEP_ARCHIVE 

นี่คือเอกสารAWS S3 Post Object