我不确定您是否了解DigitalOcean的新Spaces,这是一个像S3一样的K / V对象存储。事实上,他们甚至使它与S3 API兼容 - 除了一个主要问题。他们现在只允许V2签名。
我想出了我认为可行的方法,但事实并非如此。
有人可以指出我正确的方向吗?似乎没有人在任何地方站出来说他们知道如何使用V2签名。
谢谢!
function generateSignature($a) {
$awsKeyId = 'KEY_ID';
$awsSecret = 'SECRET_KEY';
$expires = time() + (5*60);
$httpVerb = "GET";
$contentMD5 = "";
$contentType = "";
$amzHeaders = "";
$amzResource = "/" . $a;
$str = "AWS2-HMAC-SHA1"."\n" .
date(DateTime::ISO8601) . "\n" .
date('Ymd') . "/nyc3.digitaloceanspaces.com/s3/aws2_request" . "\n" .
base64_encode(sha1());
$dateKey = hash_hmac("sha1",$awsSecret,date("Ymd"));
$dateRegionKey = sha1($dateKey,"nyc3.digitaloceanspaces.com");
$dateRegionServiceKey = sha1($dateRegionKey,"s3");
$signingKey = sha1($dateRegionServiceKey."aws2_request");
$signature = base64_encode(hash_hmac('sha1',$str,$signingKey));
$url = "https://repo-name.nyc3.digitaloceanspaces.com%s?AWSAccessKeyId=%s&Expires=%s&Signature=%s";
$presignedUrl = sprintf( $url , $amzResource , $awsKeyId , $expires , $signature );
return $presignedUrl;
}
答案 0 :(得分:0)
从这一行开始......
$str = "AWS2-HMAC-SHA1"."\n"
...你在那里拥有的一切,以下实际上只是签名版本4,只有一些变化。这些都不是你需要的。
签名版本2有很大不同。没有级联的日期/地区/服务/签名密钥。您只需获取规范请求并使用密钥进行HMAC签名,然后使用base64结果。然后你url-escape签名,以获得+
/
=
的正确的百分比编码等价物。 (剧透警报:跳过最后一步将为您提供大约50/50的工作和非工作签名URL组合。)
从http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth处的V2文档开始,然后按照上一节中未提及的内容返回页面。
答案 1 :(得分:0)
他们现在只允许V2签名。
事实并非如此。我正在使用带空格的v4签名。
您应该使用AWS SDK,而不是重新发明所有这些内容。 http://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html#endpoint