Загрузите браузер Amazon AWS S3 на PHP (версия подписки AWS 4)

В этой документации, похоже, что-то не так: http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html

Я последовал за ним точно, и он, похоже, работает. У меня всегда была ошибка SignatureDoesNotMatch. Однако авторизация v2 работает. Заставляет меня задаться вопросом, является ли это своего рода продуктом качества Alpha-stage.

Ниже приведен мой PHP-код. Я попытался подражать примеру на этой странице: http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

<?php $secret = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; $datenow = '20130806'; $region = 'us-east-1'; $service = 's3'; $terminator = 'aws4_request'; $policy = '{ "expiration": "2013-08-07T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket"}, ["starts-with", "$key", "user/user1/"], {"acl": "public-read"}, {"success_action_redirect": "http://examplebucket.s3.amazonaws.com/successful_upload.html"}, ["starts-with", "$Content-Type", "image/"], {"x-amz-meta-uuid": "14365123651274"}, ["starts-with", "$x-amz-meta-tag", ""], {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/'.$datenow.'/'.$region.'/'.$service.'/'.$terminator.'"}, {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, {"x-amz-date": "'.$datenow.'T000000Z" } ] }'; $policy64 = base64_encode($policy); assert($policy64 == $policy64); $targetPolicy64 = 'eyAiZXhwaXJhdGlvbiI=='; // echo base64_decode($targetPolicy64); // echo $policy64."\n".$targetPolicy64; assert($policy64 == $targetPolicy64); // At this point everything seems to work well. Converting the policy // to base64 resulted in exactly the same string with example. // The problem, however, happens when calculating the signature, // as shown below: $targetSignature = '21496b44de44ccb73d545f1a995c68214c9cb0d41c45a17a5daeec0b1a6db047'; $signature = ''; $hash1 = hash_hmac( 'sha256', $datenow, "AWS4".$secret, true ); $hash2 = hash_hmac( 'sha256', $region, $hash1, true ); $hash3 = hash_hmac( 'sha256', $service, $hash2, true ); $signingKey = hash_hmac( 'sha256', $terminator, $hash3, true ); $signature = base64_encode(hash_hmac( 'sha256', $policy64, $signingKey, true )); echo $signature."\n".$targetSignature; // This assertion never passed. assert($signature == $targetSignature); 

Я думал, что это проблема примера, поэтому я попытался создать примерную страницу загрузки браузера с помощью тех же методов, но это тоже не сработало.

Запуск кода подписи подписи здесь: PHP hash_hmac не соответствует примеру AWS Signature 4, однако, работает, поэтому я сомневаюсь, что проблема связана с созданием подписи или не так ли?

Пожалуйста, помогите, кто угодно.