Я пытаюсь загрузить файл с amazon s3, но получаю ошибку
Я пытаюсь загрузить файл с amazon s3, но получаю следующую ошибку
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature you provided. Check your key and signing method.
</Message>
Следующий код, который мы используем
<?php
$accessKey = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
$secretKey = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
$datestamp = new DateTime( "now" );
$longdate = $datestamp->format( "Ymd\\THisZ");
$shortdate = $datestamp->format( "Ymd" );
$date = date('Ymd',time());
$timestamp = date('Ymd',time()).'T'.date('His',time()).'Z';
$shortdate = date('Ymd',time());
$region = 'ap-south-1';
$service = 's3';
$request = 'aws4_request';
$ksecret = 'AWS4' . $secretKey;
$kdate = hash_hmac( 'sha256', $shortdate, $ksecret );
$kregion = hash_hmac( 'sha256', $region, $kdate );
$kservice = hash_hmac( 'sha256', $service, $kregion );
$ksigning = hash_hmac( 'sha256', $request, $kservice );
$canonicalRequest = "GET\n";
$canonicalRequest .= "/\n";
$canonicalRequest .= "\n";
$canonicalRequest .= "host:bucketname.s3.amazonaws.com\n";
$canonicalRequest .= "x-amz-date:". $timestamp ."\n";
$canonicalRequest .= "\n";
$canonicalRequest .= "host;x-amz-date\n";
$canonicalRequest .= hash( 'sha256', '{}' );
$canonicalRequest = hash( 'sha256', $canonicalRequest );
$stringToSign = "AWS4-HMAC-SHA256\n";
$stringToSign .= $longdate . "\n";
$stringToSign .= $shortdate . "/". $region ."/". $service ."/". $request ."\n";
$stringToSign .= $canonicalRequest;
echo $stringToSign;
echo "<br>";
echo $ksigning;
echo "<br>";
$signature = hash_hmac( 'sha256', $stringToSign, base64_encode($ksigning) );
$params = [
'X-Amz-Algorithm' => 'AWS4-HMAC-SHA256',
'X-Amz-Credential' => $accessKey . '/'. $shortdate .'/'. $region .'/'. $service .'/' . $request,
'X-Amz-Date' => $timestamp,
'X-Amz-Expires' => 86400,
'X-Amz-SignedHeaders' => 'host;x-amz-date',
'X-Amz-Signature' => trim($signature)
];
$url = 'https://bucketname.s3.amazonaws.com/1.jpg';
$count = 0;
foreach($params AS $key => $value)
{
$count++;
$url .= ($count == 1 ? '?' : '&') . $key .= '=' . $value;
}
echo $url . "
";
1
Author: Chirag Gondaliya, 2019-07-11
1 answers
Я пытаюсь следующим образом решить эту проблему
<?php
require('aws.phar');
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
$config = array(
'version' => '2006-03-01',
'credentials' => [
'key' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXX',
'secret' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXX',
],
'region' => 'ap-south-1', // your region get from amazon s3
);
$s3v2 = S3Client::factory($config);
$cmd = $s3v2->getCommand('GetObject', [
'Bucket' => 'bucket_name',
'Key' => '1.jpg' // file name
]);
$request = $s3v2->createPresignedRequest($cmd, '+20 minutes');
// Get the actual presigned-url
$presignedUrl = (string)$request->getUri();
echo $presignedUrl;
?>
3
Author: Chirag Gondaliya, 2019-07-12 04:08:37