PHP/Amazon S3:查询字符串身份验证有时会失败

Tar*_*haf 6 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);
Run Code Online (Sandbox Code Playgroud)

Sp $ bucket和$ linksValidForSeconds是常量,$ filename是例如"Media/Pictures/My Picture.png".但是对于相同变量的事件,它有时是有效的,因此不能.

有任何想法吗?

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

Tar*_*haf 3

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

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

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