IE的AWS签名问题

时间:2013-12-10 08:31:14

标签: javascript internet-explorer amazon-web-services amazon-s3 cors

我目前正在将文件直接上传到S3。用户应该能够将文件/文件拖动到站点的已定义部分。然后,对我的服务器的请求启动并为上载的文件/文件生成签名

首先,我请求从服务器计算的有效签名。生成的签名如下所示:

 [
  {
  "success_action_status":"<status>successful</status>",
  "formAction":"http://[mybucket].s3.amazonaws.com",
  "Policy":"ew0KICJleHBpcmF0aW9uIjoiMjAxMy0xMi0xMVQwODoxMjo1Ni4wMDBaIiwN\nCiAiY29uZGl0aW9ucyI6DQogWw0KICB7DQogICAiYnVja2V0IjoiaHJ3b3Jr\ncy1kb2N1bWVudHMtZGV2ZWxvcG1lbnQtc2ltIg0KICB9LA0KICB7DQogICAi\nYWNsIjoiYnVja2V0LW93bmVyLWZ1bGwtY29udHJvbCINCiAgfSwNCiAgWyAi\nc3RhcnRzLXdpdGgiLCIka2V5IiwiIl0sDQogIFsgInN0YXJ0cy13aXRoIiwi\nJENvbnRlbnQtVHlwZSIsIiJdLA0KICB7DQogICAic3VjY2Vzc19hY3Rpb25f\nc3RhdHVzIjoiPHN0YXR1cz5zdWNjZXNzZnVsPC9zdGF0dXM+Ig0KICB9DQog\nXQ0KfQ0K",
  "signature":"z8vyDsAYzfFTW6bzrwMUrh/34Uc=",
  "doumentId":"6X7TP57L8S8",
  "acl":"bucket-owner-full-control",
  "Content-Type":"application/pdf",
  "AWSAccessKeyId":"AKIAIK67BLP7RUKG354A",
  "key":"14250053/6X7TP57L8S8.pdf"
  }
 ]

在此之后我开始使用xmlhtttprequest将文件上传到s3。 在这里,我最近遇到了success_action_redirect无法处理此类请求的问题,因此您必须使用success_action_status。 上传后收到success_action_status消息后,我必须通知我的服务器,上次请求上传当前上传的文件是成功的。

我遇到的问题是:这在Chrome,Opera和Firefox中运行良好。但它与IE 10失败了。 我也可以将文件拖到文档部分进行上传,并调用对我的服务器的请求(并附加到文件对象)。在控制台中,我看到一个200响应的CORS预检请求。所以这也有效。 在此之后,在上传文件开始时,Internet Explorer 10卡住并从amazon aws收到403

 <?xml version="1.0" encoding="UTF-8"?>
 <Error>
  <Code>SignatureDoesNotMatch</Code>
  <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
  <StringToSignBytes>65 77 30 4b 49 43 4a 6c 65 48 42 70 63 6d 46 30 61 57 39 75 49 6a 6f 69 4d 6a 41 78 4d 79 30 78 4d 69 30 78 4d 56 51 77 4f 44 6f 78 4d 6a 6f 31 4e 69 34 77 4d 44 42 61 49 69 77 4e 0a 43 69 41 69 59 32 39 75 5a 47 6c 30 61 57 39 75 63 79 49 36 44 51 6f 67 57 77 30 4b 49 43 42 37 44 51 6f 67 49 43 41 69 59 6e 56 6a 61 32 56 30 49 6a 6f 69 61 48 4a 33 62 33 4a 72 0a 63 79 31 6b 62 32 4e 31 62 57 56 75 64 48 4d 74 5a 47 56 32 5a 57 78 76 63 47 31 6c 62 6e 51 74 63 32 6c 74 49 67 30 4b 49 43 42 39 4c 41 30 4b 49 43 42 37 44 51 6f 67 49 43 41 69 0a 59 57 4e 73 49 6a 6f 69 59 6e 56 6a 61 32 56 30 4c 57 39 33 62 6d 56 79 4c 57 5a 31 62 47 77 74 59 32 39 75 64 48 4a 76 62 43 49 4e 43 69 41 67 66 53 77 4e 43 69 41 67 57 79 41 69 0a 63 33 52 68 63 6e 52 7a 4c 58 64 70 64 47 67 69 4c 43 49 6b 61 32 56 35 49 69 77 69 49 6c 30 73 44 51 6f 67 49 46 73 67 49 6e 4e 30 59 58 4a 30 63 79 31 33 61 58 52 6f 49 69 77 69 0a 4a 45 4e 76 62 6e 52 6c 62 6e 51 74 56 48 6c 77 5a 53 49 73 49 69 4a 64 4c 41 30 4b 49 43 42 37 44 51 6f 67 49 43 41 69 63 33 56 6a 59 32 56 7a 63 31 39 68 59 33 52 70 62 32 35 66 0a 63 33 52 68 64 48 56 7a 49 6a 6f 69 50 48 4e 30 59 58 52 31 63 7a 35 7a 64 57 4e 6a 5a 58 4e 7a 5a 6e 56 73 50 43 39 7a 64 47 46 30 64 58 4d 2b 49 67 30 4b 49 43 42 39 44 51 6f 67 0a 58 51 30 4b 66 51 30 4b</StringToSignBytes>
  <RequestId>92D4E69C75687EB6</RequestId>
  <HostId>27jK6m/fqwKxHIj77uVNP+WNjnIGGIP+tIGrRYwHD1MwDmf3kz5saN7a7KL5e1fA</HostId>
  <SignatureProvided>z8vyDsAYzfFTW6bzrwMUrh/34Uc=</SignatureProvided>
  <StringToSign>ew0KICJleHBpcmF0aW9uIjoiMjAxMy0xMi0xMVQwODoxMjo1Ni4wMDBaIiwN
   CiAiY29uZGl0aW9ucyI6DQogWw0KICB7DQogICAiYnVja2V0IjoiaHJ3b3Jr
   cy1kb2N1bWVudHMtZGV2ZWxvcG1lbnQtc2ltIg0KICB9LA0KICB7DQogICAi
   YWNsIjoiYnVja2V0LW93bmVyLWZ1bGwtY29udHJvbCINCiAgfSwNCiAgWyAi
   c3RhcnRzLXdpdGgiLCIka2V5IiwiIl0sDQogIFsgInN0YXJ0cy13aXRoIiwi
   JENvbnRlbnQtVHlwZSIsIiJdLA0KICB7DQogICAic3VjY2Vzc19hY3Rpb25f
   c3RhdHVzIjoiPHN0YXR1cz5zdWNjZXNzZnVsPC9zdGF0dXM+Ig0KICB9DQog
   XQ0KfQ0K</StringToSign>
  <AWSAccessKeyId>AKIAIK67BLP7RUKG354A</AWSAccessKeyId>
 </Error>

我想知道为什么这在firefox和chrome中完美运行,但在Internet Explorer中失败了。由于在我的服务器上创建了签名,并且在两种情况下(Chrome / IE)都是“相同”的响应,因此签名应该匹配。

有谁知道为什么IE失败而chrome / firefox工作得很好?如果需要,我也可以发布我的请求和亚马逊的回复。

1 个答案:

答案 0 :(得分:1)

在不使用FormData(使用How to send multipart/form-data form content by ajax (no jquery)?)重构整个ajax调用之后,错误也存在,使用fiddler2,请求中没有差异。但是,最后我发现了这个bug,使用了fiddler和hex-output。

Firefox和Chrome取代&#34; \ n&#34;在json响应&#34; \ r \ n&#34;,Internet Explorer没有。 默认情况下替换&#34; \ n&#34;用&#34; \ r \ n&#34;工作和解决方案。现在它工作正常。