AWSOAuth.class.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. class AWSOAuth {
  3. private static $SECRET_KEY = "+vB6pF3kIVHOljYeUnjIpziVHcJxy7F9j+fW3eWH";
  4. private static $ACCESS_KEY = "AKIAJHK7XI7GFCS24S2Q";
  5. private static $WRITE_SECRET_KEY = "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";
  6. private static $WRITE_ACCESS_KEY = "AKIAJXBZQQGTOWROMJPA";
  7. private STATIC $MINUTES_EXPIRES = 240;
  8. private function lazySignature($key, $data) {
  9. if (strlen($key) > 64) {
  10. $key = pack('H*', sha1($key));
  11. }
  12. $key = str_pad($key, 64, chr(0x00));
  13. $ipad = str_repeat(chr(0x36), 64);
  14. $opad = str_repeat(chr(0x5c), 64);
  15. $hmac = pack( 'H*', sha1(
  16. ($key ^ $opad) . pack( 'H*', sha1(
  17. ($key ^ $ipad) . $data
  18. ))
  19. ));
  20. return base64_encode($hmac);
  21. }
  22. public function getFileSecureParams($bucket, $fileName) {
  23. $expires = time() + intval(floatval(AWSOAuth::$MINUTES_EXPIRES) * 60);
  24. $fileName = str_replace('%2F', '/', rawurlencode($fileName = ltrim($fileName, '/')));
  25. $signpath = '/'. $bucket .'/'. $fileName;
  26. $signsz = implode("\n", $pieces = array('GET', null, null, $expires, $signpath));
  27. $signature = $this->lazySignature(AWSOAuth::$SECRET_KEY, $signsz);
  28. $qs = http_build_query($pieces = array(
  29. 'AWSAccessKeyId' => AWSOAuth::$ACCESS_KEY,
  30. 'Expires' => $expires,
  31. 'Signature' => $signature,
  32. ));
  33. return $qs;
  34. }
  35. public function putFileSecureParams($bucket, $region, $filePath, $params = "") {
  36. $returnParams = array();
  37. $cleanFilePath = str_replace("%2F", "/", rawurlencode($filePath));
  38. $returnParams['clean_file'] = $cleanFilePath;
  39. $url = "https://".$bucket.".s3.amazonaws.com". $cleanFilePath . $params;
  40. $returnParams["url"] = $url;
  41. $now = time();
  42. $longDate = gmdate("Ymd\THis\Z", $now);
  43. $shortDate = gmdate("Ymd", $now);
  44. $method = "PUT";
  45. $service = "s3";
  46. $algorithm = "AWS4-HMAC-SHA256";
  47. $timeToLive = 3600;
  48. $contentHash = "UNSIGNED-PAYLOAD";
  49. $scope = $shortDate. "/" . $region . "/".$service."/aws4_request";
  50. $credentialString = AWSOAuth::$WRITE_ACCESS_KEY . "/" . $scope;
  51. $headers = array();
  52. $headers["host"] = parse_url($url, PHP_URL_HOST);
  53. $headers["x-amz-content-sha256"] = $contentHash;
  54. $headers["x-amz-date"] = $longDate;
  55. ksort($headers);
  56. $signedHeaders = implode(";", array_keys($headers));
  57. $query = parse_url($url, PHP_URL_QUERY);
  58. parse_str($query, $params);
  59. ksort($params);
  60. $query = http_build_query($params);
  61. $canonicalRequest = $this->generateCanonicalRequest($headers, $method, $cleanFilePath, $query, $signedHeaders, $contentHash);
  62. $returnParams["canonical_request"] = $canonicalRequest;
  63. $stringToSign = $this->generateStringToSign($canonicalRequest, $algorithm, $longDate, $scope);
  64. $returnParams["string_to_sign"] = $stringToSign;
  65. $signature = $this->generateSignature(AWSOAuth::$WRITE_SECRET_KEY, $shortDate, $region, $service, $stringToSign);
  66. $returnParams["signature"] = $signature;
  67. $authorizationString = $this->generateAuthorization($credentialString, $signedHeaders, $signature, $algorithm);
  68. $headers["Authorization"] = $authorizationString;
  69. unset($headers['host']);
  70. $returnParams["headers"] = $headers;
  71. return $returnParams;
  72. }
  73. public function getFileSecureParams2($bucket, $region, $filePath, $params = "") {
  74. $returnParams = array();
  75. $cleanFilePath = str_replace("%2F", "/", rawurlencode($filePath));
  76. $returnParams['clean_file'] = $cleanFilePath;
  77. $url = "https://".$bucket.".s3.amazonaws.com" . $cleanFilePath . $params;
  78. $returnParams["url"] = $url;
  79. $now = time();
  80. $longDate = gmdate("Ymd\THis\Z", $now);
  81. $shortDate = gmdate("Ymd", $now);
  82. $method = "GET";
  83. $service = "s3";
  84. $algorithm = "AWS4-HMAC-SHA256";
  85. $timeToLive = 3600;
  86. $contentHash = hash('sha256', '');
  87. $scope = $shortDate. "/" . $region . "/".$service."/aws4_request";
  88. $credentialString = AWSOAuth::$ACCESS_KEY . "/" . $scope;
  89. $headers = array();
  90. $headers["host"] = parse_url($url, PHP_URL_HOST);
  91. $headers["x-amz-content-sha256"] = $contentHash;
  92. $headers["x-amz-date"] = $longDate;
  93. ksort($headers);
  94. $signedHeaders = implode(";", array_keys($headers));
  95. $query = parse_url($url, PHP_URL_QUERY);
  96. parse_str($query, $params);
  97. ksort($params);
  98. $query = http_build_query($params);
  99. $canonicalRequest = $this->generateCanonicalRequest($headers, $method, $cleanFilePath, $query, $signedHeaders, $contentHash);
  100. $returnParams["canonical_request"] = $canonicalRequest;
  101. $stringToSign = $this->generateStringToSign($canonicalRequest, $algorithm, $longDate, $scope);
  102. $returnParams["string_to_sign"] = $stringToSign;
  103. $signature = $this->generateSignature(AWSOAuth::$SECRET_KEY, $shortDate, $region, $service, $stringToSign);
  104. $returnParams["signature"] = $signature;
  105. $authorizationString = $this->generateAuthorization($credentialString, $signedHeaders, $signature, $algorithm);
  106. $headers["Authorization"] = $authorizationString;
  107. $returnParams["authorization"] = $authorizationString;
  108. unset($headers['host']);
  109. $returnParams["headers"] = $headers;
  110. return $returnParams;
  111. }
  112. public function generateAuthorization($credentialString, $signedHeaders, $signature, $algorithm) {
  113. $params = array();
  114. $params[] = "Credential=".$credentialString;
  115. $params[] = "SignedHeaders=" . $signedHeaders;
  116. $params[] = "Signature=" . $signature;
  117. return $algorithm . " " . implode(",", $params);
  118. }
  119. public function generateSignature($secretKey, $shortDate, $region, $service, $stringToSign) {
  120. $dateKey = hash_hmac("sha256", $shortDate, "AWS4" . $secretKey, true);
  121. $regionKey = hash_hmac("sha256", $region, $dateKey, true);
  122. $serviceKey = hash_hmac("sha256", $service, $regionKey, true);
  123. $signingKey = hash_hmac("sha256", "aws4_request", $serviceKey, true);
  124. return hash_hmac("sha256", $stringToSign, $signingKey);
  125. }
  126. public function generateStringToSign($canonicalRequest, $algorithm, $longDate, $scope) {
  127. $reqHash = hash("sha256", $canonicalRequest);
  128. $stringToSignData = array();
  129. $stringToSignData[] = $algorithm;
  130. $stringToSignData[] = $longDate;
  131. $stringToSignData[] = $scope;
  132. $stringToSignData[] = $reqHash;
  133. return implode("\n", $stringToSignData);
  134. }
  135. public function generateCanonicalRequest($headers, $method, $filePath, $query, $signedHeaders, $contentHash) {
  136. $canonicalHeaderData = array();
  137. foreach ($headers as $key => $value) {
  138. $canonicalHeaderData[] = $key . ":" . $value;
  139. }
  140. $canonicalHeaderString = implode("\n", $canonicalHeaderData);
  141. $canonicalRequestData = array();
  142. $canonicalRequestData[] = $method;
  143. $canonicalRequestData[] = $filePath;
  144. $canonicalRequestData[] = $query;
  145. $canonicalRequestData[] = $canonicalHeaderString;
  146. $canonicalRequestData[] = null;
  147. $canonicalRequestData[] = $signedHeaders;
  148. $canonicalRequestData[] = $contentHash;
  149. return implode("\n", $canonicalRequestData);
  150. }
  151. }