2013-07-22 78 views
1

所以我的iPhone应用程序成功地将照片上传到Amazon S3。我使用与S3Uploader示例项目相同的代码,以及适用于iOS的最新(1.6.0版)Amazon AWS SDK。问题是间歇性地出现SignatureDoesNotMatch错误(我们计算的请求签名与您提供的签名不匹配,请检查您的密钥和签名方法)。它没有模式。目前我的应用程序通过在委托调用didFailWithError上执行一定数量的重试来解决此错误。Amazon S3 iOS SDK照片上传错误有时候 - SignatureDoesNotMatch

到目前为止,我的测试有足够的重试次数,所以用户不会注意到这个错误,但是当我的签名显然是正确的时候知道我得到了一个签名密钥错误是相当令人沮丧的,因为它有时会起作用。我不确定它是否是URL编码错误(我的签名密钥有+号),但是由于我使用的是iOS SDK,我没有看到如何处理PUT网址。

此外,我验证了我的存储桶名称都是小写字母,我的文件名只是数字和一些字母。我也尝试了不同的地区,他们都有相同的结果。简而言之,它可以从0次重试到5次重试,从而在没有SignatureDoesNotMatch错误的情况下获得成功的PUT。有没有人有类似的问题?任何帮助将不胜感激。谢谢阅读。

+0

我是AWS SDK for iOS的维护人员之一。您表示您使用的是与S3Uploader相同的代码。这是否意味着您正在使用嵌入凭证?请注意,我们不建议您这样做,因为您的应用可能会被泄露并且提取证书。 这就是说,这个错误只发生在最终用户的设备上,还是你能够在你自己的设备或模拟器上重现它? –

+0

嗨,鲍勃。谢谢回复!另外,感谢您获取嵌入凭证的信息。 IAM会是更安全的路线吗?如果是这样,你能指示我使用iOS SDK的IAM的一些例子吗?关于我最初的问题,该应用程序仍在开发中,所以我只能自己测试并生成它(在模拟器中 - 尚未在设备上尝试过)。所以到目前为止,唯一的PUT请求来自我自己。谢谢你的时间。 – rymagno

+0

使用IAM凭证肯定会比使用根凭证更好,但不会消除可能受到危害的应用程序问题。我们建议使用TVM或Web联合身份验证。版本1.6。适用于iOS的AWS SDK的0包含这两种凭证管理方法的样本。您还可以阅读以下文章以获取更多信息[网络联合身份验证](http://aws.amazon.com/articles/4617974389850313),[令牌自动贩卖机](http://aws.amazon.com/articles/4611615499399490 )。 –

回答

2

好的。因此,在花了几天的时间尝试新的桶之后......尝试所有不同的NSString编码/ UIImage到NSData语句......从嵌入式切换到TVM ......从我的项目跳转到TVM演示......并阅读调试输出页面和页面......我发现它与任何这些都没有关系! :P

一旦我意识到我已经无意中将AWS框架复制到我的项目文件夹中,我将它们删除并重新添加它们而没有选中复制框(引用我的SDK文件夹)。繁荣 - 没有更多的签名错误。

AWS SDK显然不喜欢在一个系统上有多个框架实例。希望这可以帮助别人! :)

3

您可能需要在签名后按摩签名,因为有效的base64在查询字符串中并不总是有效。我必须在一个时间碰到了同样的问题,一旦问题,因为我发现一些代码,我写了如下评论:

# the "+" is not url-safe, as it gets converted to a space somewhere along the line 

# '+' => '%2B' 

# while we're at it, we'll go ahead and convert the other non-safe-ish 
# characters even though the links seem to work without this step 

# '/' => '%2F' 
# '=' => '%3D' 

我的代码执行字符串搜索和替换为那些3个字符,它们改变自己的网址 - 在将查询字符串返回给调用者之前编码的等价物。我使用了搜索/替换策略,因为我工作的环境没有合适的url编码库。由于这些是我的代码可能生成的仅有的3个base64字符,显然不是网址安全的,所以我显然继续并处理了所有三种可能性。

+0

谢谢迈克尔 - 因为我使用AWS iOS SDK,它实际上是为我处理URL。但是,如果将来我自己处理它,我会用它作为参考。 – rymagno

+1

伙伴,非常感谢。你救了我,我只能想象会花几个小时试图弄清楚到底发生了什么。队友的欢呼声。 –