StsClient.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. namespace OSS\Tests;
  3. use OSS\Core\OssException;
  4. require_once __DIR__ . DIRECTORY_SEPARATOR . 'StsBase.php';
  5. require_once __DIR__ . DIRECTORY_SEPARATOR . 'AssumeRole.php';
  6. class StsClient
  7. {
  8. public $AccessSecret;
  9. public function doAction($params, $format="JSON")
  10. {
  11. $request_url = $this->generateSignedURL($params);
  12. $response = $this->sendRequest($request_url, $format);
  13. $result= $this->parseResponse($response, $format);
  14. return $result;
  15. }
  16. private function sendRequest($url, $format)
  17. {
  18. $curl_handle = curl_init();
  19. curl_setopt($curl_handle, CURLOPT_URL, $url);
  20. curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
  21. curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, "GET");
  22. curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, false);
  23. curl_setopt($curl_handle, CURLOPT_SSL_VERIFYHOST,false);
  24. curl_setopt($curl_handle, CURLOPT_HEADER, true);
  25. $response = curl_exec($curl_handle);
  26. $headerSize = curl_getinfo($curl_handle, CURLINFO_HEADER_SIZE);
  27. $response = substr($response, $headerSize);
  28. if (curl_getinfo($curl_handle, CURLINFO_HTTP_CODE) != '200') {
  29. $errors = $this->parseResponse($response, $format);
  30. throw new OssException($errors->Code);
  31. }
  32. if (PHP_VERSION_ID < 80500) {
  33. curl_close($curl_handle);
  34. }
  35. return $response;
  36. }
  37. private function parseResponse($body, $format)
  38. {
  39. if ("JSON" == $format) {
  40. $respObject = json_decode($body);
  41. } elseif ("XML" == $format) {
  42. $respObject = @simplexml_load_string($body);
  43. } elseif ("RAW" == $format) {
  44. $respObject = $body;
  45. }
  46. return $respObject;
  47. }
  48. private function generateSignedURL($arr)
  49. {
  50. $request_url = 'https://sts.aliyuncs.com/?';
  51. foreach ($arr as $key=>$item) {
  52. if (is_null($item)) unset($arr[$key]);
  53. }
  54. $Signature = $this->computeSignature($arr, $this->AccessSecret);
  55. ksort($arr);
  56. foreach ($arr as $key => $value) {
  57. $request_url .= $key."=".urlencode($value)."&";
  58. }
  59. $request_url .="Signature=".urlencode($Signature);
  60. return $request_url;
  61. }
  62. private function computeSignature($parameters, $accessKeySecret)
  63. {
  64. ksort($parameters);
  65. $canonicalizedQueryString = '';
  66. foreach ($parameters as $key => $value) {
  67. $canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
  68. }
  69. $stringToSign = 'GET&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
  70. $signature = $this->signString($stringToSign, $accessKeySecret."&");
  71. return $signature;
  72. }
  73. private function signString($source, $accessSecret)
  74. {
  75. return base64_encode(hash_hmac('sha1', $source, $accessSecret, true));
  76. }
  77. private function percentEncode($str)
  78. {
  79. $res = urlencode($str);
  80. $res = preg_replace('/\+/', '%20', $res);
  81. $res = preg_replace('/\*/', '%2A', $res);
  82. $res = preg_replace('/%7E/', '~', $res);
  83. return $res;
  84. }
  85. }