amazon web services - S3,在PHP中验证签名URL,解构签名URL


amazon web services - S3 ,verify a signed URL in PHP, Deconstruct signed URL

我使用s3直接上传与数据库一起存储文件的url(以及其他数据,如谁上传等)。为了允许直接上传到s3,我创建了一个预先指定的URL,如:

$s3 = App::make('aws')->createClient('s3', [
            'credentials' => [
                'key' => 'AAAAAAAAAAAAAAA',
                'secret' => 'YYYYYYYYYYYYYYYYYYYY',
            ]
        ]);

 $command = $s3->getCommand('PutObject', [
            '@use_accelerate_endpoint'=>true,
            'Bucket' => 'remdev-experimental',
            'Key' => "newest newest.txt",
            'Metadata' => array(
                'foo' => "test",
            )
        ]);

        return response()->json(((string)$s3->createPresignedRequest($command, '+1 minutes')->getUri()));

现在,在客户端完成文件上传后,我想让服务器知道它。所以我会要求客户给我发一个请求,通知他已经完成了上传。对此,我认为最简单(也是最安全)的方法就是允许客户端发送回他刚刚发送回来的签名URL。

是否有解析URL的方法?我对获得对象密钥感兴趣,更重要的是,我想验证URL没有被篡改(也就是说,URL中的签名应该与其余内容匹配)。如何在php sdk中做到这一点?

签名URL是文件的URL,其中包含了查询数据中的签名信息。因此,对bucket: remdev-experimental文件:abc.txt的签名请求看起来像https://s3.amazonaws.com/remdev-experimental/abc.txt?X-Amz-Date=date&X-Amz-Expires=60&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=signature&X-Amz-Credential=SOMEID/20160703/us-east-1/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=some-long-token,因此您需要做的就是获取URL的路径(/remdev-experimental/abc.txt)并接受第二个斜杠之后的所有内容。

您还应该知道,您可以让S3在HTTP post策略中使用success_action_redirect将浏览器重定向到URL

最后你可以让S3触发一个通知到你的服务器(通过SQS, SNS,或Lambda)每当一个文件被上传