Я новичок в AWS. Может кто-нибудь, пожалуйста, помогите мне, как сгенерировать токен сессии, используя STS API для загрузки файлов на S3.
Коротко:
Я просмотрел документацию AWS и исследовал в Google. Я нашел ниже библиотеку для codeigniter для загрузки файлов на S3
https://github.com/psugand/CodeIgniter-S3
Он работает нормально, и я могу загружать файлы, используя свой идентификатор доступа и секретный ключ. Но наше требование — генерировать временные учетные данные из Amazon и отправлять разработчикам iOS, чтобы они могли загружать файлы непосредственно в S3. Ниже я нашел ссылку на документацию Amazon, где мне нужно выполнить 4 Задачи, чтобы получить временные учетные данные.
http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
Но кое-как ответ всегда говорит, что подпись, которую я создаю, не совпадает. Ниже мой код и ответ от Amazon. Если я делаю что-то не так, пожалуйста, помогите мне.
$AWSAccessKeyId = "AKIAIK4R57JLAFN4Z5SA";
$SecretAccessKey = AMAZON_SECRET_KEY;
$region = 'us-east-1';
$service = 'sts';
$term = 'aws4_request';
$Timestamp = gmdate('D, d M Y H:i:s') . ' GMT';
$date = gmdate('Ymd\THis\Z');
$credentialsScope = gmdate('Ymd').'/'.$region.'/'.$service.'/'.$term;
$credentials = $AWSAccessKeyId.'/'.$credentialsScope;
Задача 1 Канонический запрос
$CanonicalRequest =
'POST'."\n".
"/"."\n".
'Action=GetSessionToken&Version=2011-06-15&Name=Aasim&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600&X-Amz-Credential='.$credentials.'&X-Amz-Date='.$date.'&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-date'."\n".
'content-type:text/xml;charset=utf-8'."\n".
'host:sts.amazonaws.com'."\n".
'x-amz-date:'.$Timestamp."\n"."\n".
'content-type;host;x-amz-date'."\n".
hash("sha256",'UNSIGNED-PAYLOAD')."\n";
$hashedRequestPayload = hash("sha256",$CanonicalRequest);
Задача 2 создание строки для подписи
$StringToSign =
'AWS4-HMAC-SHA256'."\n".
$date."\n".
$credentialsScope."\n".
$hashedRequestPayload;
Задача 3 Расчет подписи
$kDate = hash_hmac('sha256', 'AWS4'.$SecretAccessKey, gmdate('Ymd'));
$kRegion = hash_hmac('sha256', $kDate,'us-east-1');
$kService = hash_hmac('sha256', $kRegion,'sts');
$kSigning = hash_hmac('sha256', $kService,'aws4_request');
$Signature = hash_hmac('sha256',$kSigning, $StringToSign);
Задача 4 Добавить информацию о подписи в запрос
$querystring = 'Action=GetSessionToken';
$querystring .= '&Version=2011-06-15';
$querystring .= '&X-Amz-Algorithm=AWS4-HMAC-SHA256';
$querystring .= '&X-Amz-Credential='.$credentials;
$querystring .= '&X-Amz-Date='.$date;
$querystring .= '&X-Amz-Expires=3600';
$querystring .= '&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-date';
$querystring .= '&X-Amz-Signature='.$Signature;
Выполнение запроса Curl
$endpoint = 'https://sts.amazonaws.com/?'.$querystring;
$headers = array(
'x-amz-date:'.$Timestamp,
'host:sts.amazonaws.com',
'content-type: text/xml;charset=utf-8',
);
$session = curl_init($endpoint); // create a curl session
curl_setopt($session, CURLOPT_POST, true); // POST request type
curl_setopt($session, CURLOPT_RETURNTRANSFER, true); // return values as a string - not to std out
curl_setopt($session, CURLOPT_HTTPHEADER, $headers);
$responseXML = curl_exec($session);
print_r($responseXML);
Ответ от Amazon
<ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<Error>
<Type>Sender</Type>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
The Canonical String for this request should have been
'POST
/
Action=GetSessionToken&Version=2011-06-15&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIK4R57JLAFN4Z5SA%2F20141231%2Fus-east-1%2Fsts%2Faws4_request&X-Amz-Date=20141231T065554Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-date
content-type:text/xml;charset=utf-8
host:sts.amazonaws.com
x-amz-date:Wed, 31 Dec 2014 06:55:54 GMT
content-type;host;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
The String-to-Sign should have been
'AWS4-HMAC-SHA256
20141231T065554Z
20141231/us-east-1/sts/aws4_request
c3ec81de483674a1bf52b60307ae36a4b5e00cff6c85a30f07cc5d00eeb0d699'
</Message>
</Error>
<RequestId>15cb2945-90ba-11e4-829d-1362e6783c1f</RequestId>
</ErrorResponse>
Я использую Codeiginter для этого. Пожалуйста, помогите мне . заранее спасибо
Задача ещё не решена.
Других решений пока нет …