Amazon S3 iOS SDK 照片上传有时会出错 - SignatureDoesNotMatch

Posted

技术标签:

【中文标题】Amazon S3 iOS SDK 照片上传有时会出错 - SignatureDoesNotMatch【英文标题】:Amazon S3 iOS SDK Photo Upload Error SOMETIMES - SignatureDoesNotMatch 【发布时间】:2013-07-21 20:19:06 【问题描述】:

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

到目前为止,我的测试已经进行了足够多的重试,因此用户不会注意到错误,但是当我的签名明显正确时知道我收到签名密钥错误是非常令人沮丧的,因为它有时会起作用。我不确定这是否是 url 编码错误(我的签名密钥中有一个 + 号),但由于我使用的是 iOS SDK,我看不到 PUT url 的处理方式。

另外,我验证了我的存储桶名称都是小写的,我的文件名只是数字和几个字母。我也尝试了不同的区域,它们都有相同的结果。简而言之,它可能需要 0 次重试到 5 次重试才能获得成功的 PUT 而不会出现 SignatureDoesNotMatch 错误。有没有人有类似的问题?任何帮助将不胜感激。感谢阅读。

【问题讨论】:

我是适用于 iOS 的 AWS 开发工具包的维护者之一。您表明您使用与 S3Uploader 相同的代码。这是否意味着您正在使用嵌入式凭据?请注意,我们不建议这样做,因为您的应用程序可能会受到损害并提取凭据。话虽如此,此错误是否仅发生在最终用户的设备上,还是您能够在自己的设备或模拟器上重现它? 嗨,鲍勃。谢谢回复!另外,感谢您提供有关嵌入式凭据的信息。 IAM 会是更安全的路线吗?如果是这样,您能否指导我使用带有 iOS SDK 的 IAM 的一些示例?关于我最初的问题,该应用程序仍在开发中,所以我只能自己测试和生产它(在模拟器中 - 尚未在设备上尝试过)。所以到目前为止,唯一的 PUT 请求来自我自己。感谢您的宝贵时间。 使用 IAM 凭证肯定比使用根凭证更好,但并不能消除您的应用程序可能被泄露的问题。我们建议使用 TVM 或 Web 身份联合。适用于 iOS 的 AWS 开发工具包版本 1.6.0 包含这两种凭证管理方法的示例。您也可以阅读以下文章了解更多信息web identity federation、token vending machine。 谢谢,鲍勃。尽管我的问题与此无关,但我仍然从您的反馈中受益。我没有使用 IAM/嵌入式凭证,而是让 TVM 服务器在 Elastic Beanstalk 上运行。学习新事物总是很好。 【参考方案1】:

您可能需要在生成签名后对其进行按摩,因为有效的 base64 在查询字符串中并不总是有效。我一定曾经遇到过同样的问题,因为我在我写的一些代码中发现了以下 cmets:

# 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 编码等效项。我使用了搜索/替换策略,因为我工作的环境没有合适的 url 编码库可用。由于这些是我的代码可以生成的唯一 3 个 base64 字符,但显然不是 url 安全的,因此我显然继续处理了所有三种可能性。

【讨论】:

谢谢 Michael - 由于我使用的是 AWS iOS 开发工具包,它实际上是在为我处理 URL。但是,如果将来我自己处理它们,我将以此作为参考。 伙伴,非常感谢。你救了我我只能想象要花几个小时才能弄清楚到底发生了什么。干杯伙伴。【参考方案2】:

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

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

AWS SDK 显然不喜欢在一个系统上拥有其框架的多个实例。希望这对其他人有帮助! :)

【讨论】:

以上是关于Amazon S3 iOS SDK 照片上传有时会出错 - SignatureDoesNotMatch的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PHP SDK 在 Amazon S3 存储桶下创建文件夹?

在iOS Swift中不使用AWS SDK在Amazon S3存储桶中上传的背景图像(背景模式)

AWS S3 Java SDK:以编程方式检测时间/时钟偏差?

如何在不使用 SDK 的情况下使用 .NET HttpClient 上传到 Amazon S3

如何在不使用 SDK 的情况下将文件从 Android 上传到 Amazon S3

Amazon S3 上传问题 Android SDK、com.amazonaws.AmazonClientException:读取的数据 (4567265) 多于预期 (4561427)