我使用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中的签名应与其余内容匹配)。我怎么能在php sdk中做到这一点?
答案 0 :(得分:1)
签名的URL是文件的URL,其中包含查询数据中的签名信息。因此,已签名的存储区请求: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
所以您需要做的就是获取网址的路径/remdev-experimental/abc.txt
并获取所有内容在第二次斜线之后。
另外,您应该知道,您可以使用HTTP post policy
中的success_action_redirect
将浏览器重定向到网址
最后,只要上传文件,您就可以让S3触发通知您的服务器(通过SQS,SNS或Lambda)。