2009-06-09 10 views
2

Ich habe direkten HTML-POSTing zu einem S3-Bucket, der für Bucket A arbeitet. Wenn ich den gesamten Code exakt gleich mache, aber die Richtlinie für Bucket B ersetze und unterzeichne, gibt Amazon einen InvalidPolicyDocument-Fehler zurück. Gibt es etwas in einem Bucket, das aktiviert oder festgelegt werden muss, bevor es gebuchte Objekte akzeptiert?S3 Post InvalidPolicyDocument Bucket-abhängig?

Vielen Dank im Voraus! Ben

ps. Ich habe den Bucket-Namen sowohl in der Richtlinie als auch in der Upload-URL geändert.

pps. Wie gewünscht, verfolgte ich beide Anfragen in Fiddler. Hier sind die Anfragen und Antworten:

THE GOOD REQUEST:

ANFRAGE:

------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="Filename" 

Blue hills.jpg 
------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="key" 

uploads/${filename} 
------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="signature" 

STJNaC3bFVXD9VSUPhId41yw5+w= 
------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="AWSAccessKeyId" 

0WDZ435HNTSCJ306SXR2 
------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="acl" 

private 
------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="success_action_status" 

201 
------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="policy" 

eydjb25kaXRpb25zJzogW3snYnVja2V0JzogJzB3ZHo0MzVobnRzY2ozMDZzeHIyLXRlc3QtYnVja2V0J30sIFsnc3RhcnRzLXdpdGgnLCAnJGtleScsICd1cGxvYWRzLyddLCBbJ3N0YXJ0cy13aXRoJywgJyRGaWxlbmFtZScsICcnXSwgeydhY2wnOiAncHJpdmF0ZSd9LCB7J3N1Y2Nlc3NfYWN0aW9uX3N0YXR1cyc6ICcyMDEnfV0sICdleHBpcmF0aW9uJzogJzIwMDktMDYtMTBUMTg6MTc6NTlaJ30= 
------------ae0KM7cH2cH2cH2Ij5Ef1cH2Ef1ae0 
Content-Disposition: form-data; name="file"; filename="Blue hills.jpg" 
Content-Type: application/octet-stream 

RESPONSE:

<?xml version="1.0" encoding="UTF-8"?> 
<PostResponse><Location>http://0wdz435hntscj306sxr2-test-bucket.s3.amazonaws.com/uploads%2FBlue+hills.jpg</Location><Bucket>0wdz435hntscj306sxr2-test-bucket</Bucket><Key>uploads/Blue hills.jpg</Key><ETag>"6fb2a38dc107eacb41cf1656e899cf70"</ETag></PostResponse> 

DAS BAD REQUEST:

ANFRAGE:

------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="Filename" 

Water lilies.jpg 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="policy" 

eydjb25kaXRpb25zJzogW3snYnVja2V0JzogdScwd2R6NDM1aG50c2NqMzA2c3hyMi1tNGxiZXRhJ30sIFsnc3RhcnRzLXdpdGgnLCAnJGtleScsICd1cGxvYWRzLyddLCBbJ3N0YXJ0cy13aXRoJywgJyRGaWxlbmFtZScsICcnXSwgeydhY2wnOiAncHJpdmF0ZSd9LCB7J3N1Y2Nlc3NfYWN0aW9uX3N0YXR1cyc6ICcyMDEnfSwgeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ31dLCAnZXhwaXJhdGlvbic6ICcyMDA5LTA2LTEwVDE4OjA5OjE0Wid9 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="key" 

uploads/${filename} 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="signature" 

u+pOKfpLrFaRhiP3lfTPbCyWl3I= 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="AWSAccessKeyId" 

0WDZ435HNTSCJ306SXR2 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="acl" 

private 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="success_action_status" 

201 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="Content-Type" 

application/octet-stream 
------------Ij5cH2cH2gL6gL6gL6Ij5Ij5GI3cH2 
Content-Disposition: form-data; name="file"; filename="Water lilies.jpg" 
Content-Type: application/octet-stream 

RESPONSE:

100 
<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>InvalidPolicyDocument</Code><Message>Invalid Policy: Invalid JSON.</Message><RequestId>2D883FC8947547AC</RequestId><HostId>G1r2SCbd87UmmlOU0hSY3/VTGGXBEmXdLXoxaGt4GJjpELBVHXtjn6PSAPhufLAC</HostId></Error> 
0 
+0

Können Sie beide Anfragen mit Fiddler verfolgen und die Ergebnisse? –

+0

Siehe meine neue Antwort. –

Antwort

3

Achten Sie darauf, den Eimer Namen ändern sowohl in der Action-URL und in der Police.

UPDATE

Hier sind die Base64-Versionen beider Richtlinien decodiert:

GOOD

{ 
    'conditions': [ 
    { 
     'bucket': '0wdz435hntscj306sxr2-test-bucket' 
    }, 
    ['starts-with', '$key', 'uploads/'], 
    ['starts-with', '$Filename', ''], 
    { 
     'acl': 'private' 
    }, 
    { 
     'success_action_status': '201' 
    } 
    ], 
    'expiration': '2009-06-10T18:17:59Z' 
} 

BAD

{ 
    'conditions': [ 
    { 
     'bucket': u'0wdz435hntscj306sxr2-m4lbeta' 
    }, 
    ['starts-with', '$key', 'uploads/'], 
    ['starts-with', '$Filename', ''], 
    { 
     'acl': 'private' 
    }, 
    { 
     'success_action_status': '201' 
    }, 
    { 
     'Content-Type': 'application/octet-stream' 
    } 
    ], 
    'expiration': '2009-06-10T18:09:14Z' 
} 

Irgendwie ein extra "u" blieb in der Bucket-Linie für die schlechte Politik stecken

+0

danke. Der Bucket-Name wird tatsächlich an beiden Stellen geändert. – mainsocial

+0

Danke Bryce! Das zusätzliche Zeichen u steht für eine Unicode-Zeichenfolge, die bei der Arbeit mit der Google App Engine der Standard-Python-Zeichenfolgetyp ist. Vermutlich muss ich es mithilfe von str() in eine reguläre Zeichenfolge konvertieren, bevor ich die Richtlinie codiere. Schöner Fang! – mainsocial

Verwandte Themen