PHP/亚马逊 S3 : Query string authentication sometimes fails

标签 php amazon-s3 digital-signature

我用 PHP 创建了一个简单的文件浏览器,它通过生成过期查询 URL 链接到文件。因此,对于目录的每次访问,都会生成一个指向每个文件的链接,该链接的有效期为 900 秒。

我现在遇到的问题是生成的签名有时似乎会失败。这很奇怪,因为我有意使用外部 S3 库来生成 URL 和签名。

事实上,我尝试了以下库来生成签名:

库内部使用 hash_hmac('sha256', ... 或 hash_hmac('sha1', ... - 我也不明白为什么要使用不同的哈希算法。

由于所有库都有相同的问题,所以它也可能出现在我的 URL 生成代码中,尽管这很简单:

$bucket = "myBucket";
$filename = $object->Key;
$linksValidForSeconds = 900;
$url = $s3->get_object_url($bucket, $filename, $linksValidForSeconds);

Sp $bucket 和 $linksValidForSeconds 是常量,$filename 例如“媒体/图片/我的图片.png”。但是对于相同变量的事件,它有时有效,有时却无效。

有什么想法吗?

编辑:拼写错误/错误的常量变量名称已修复(感谢)

最佳答案

我发现了问题,它与我提到的代码无关。生成的 URL 被 urlencode() 发送到另一个 PHP 脚本。在那里我使用 URL 来显示来自 S3 的图像。我在那里使用了 urldecode() 来撤消更改,但显然这不是必需的。

所以每次签名包含某些字符时,urldecode() 都会更改它们并破坏它。

很抱歉省略了实际的问题代码。

关于PHP/亚马逊 S3 : Query string authentication sometimes fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3754543/

相关文章:

php - Symfony 2.4 如何加载外部类?

algorithm - System.Security.Cryptography.BCryptHashAlgorithm。此平台不支持指定的加密算法

.net - 为什么 SignHash 需要知道使用的是什么哈希算法?

java - 如何在 Java 中签署和验证 RSA PKCS#1 v2.0 签名

php - 使用 Javascript/PHP 的自定义产品配置器

php - 使用 alter table 更改日期格式

javascript - 联系表格提交两次

python - 从 S3 django 下载多个文件

java - Amazon S3 存储桶子对象 REST 和 Java(无需 SDK)

amazon-web-services - 与 aws 提供商区域不同的 terraform aws_s3_bucket 区域在同一提供商区域中创建