StsClient.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. curl_close($curl_handle);
  33. return $response;
  34. }
  35. private function parseResponse($body, $format)
  36. {
  37. if ("JSON" == $format) {
  38. $respObject = json_decode($body);
  39. } elseif ("XML" == $format) {
  40. $respObject = @simplexml_load_string($body);
  41. } elseif ("RAW" == $format) {
  42. $respObject = $body;
  43. }
  44. return $respObject;
  45. }
  46. private function generateSignedURL($arr)
  47. {
  48. $request_url = 'https://sts.aliyuncs.com/?';
  49. foreach ($arr as $key=>$item) {
  50. if (is_null($item)) unset($arr[$key]);
  51. }
  52. $Signature = $this->computeSignature($arr, $this->AccessSecret);
  53. ksort($arr);
  54. foreach ($arr as $key => $value) {
  55. $request_url .= $key."=".urlencode($value)."&";
  56. }
  57. $request_url .="Signature=".urlencode($Signature);
  58. return $request_url;
  59. }
  60. private function computeSignature($parameters, $accessKeySecret)
  61. {
  62. ksort($parameters);
  63. $canonicalizedQueryString = '';
  64. foreach ($parameters as $key => $value) {
  65. $canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
  66. }
  67. $stringToSign = 'GET&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
  68. $signature = $this->signString($stringToSign, $accessKeySecret."&");
  69. return $signature;
  70. }
  71. private function signString($source, $accessSecret)
  72. {
  73. return base64_encode(hash_hmac('sha1', $source, $accessSecret, true));
  74. }
  75. private function percentEncode($str)
  76. {
  77. $res = urlencode($str);
  78. $res = preg_replace('/\+/', '%20', $res);
  79. $res = preg_replace('/\*/', '%2A', $res);
  80. $res = preg_replace('/%7E/', '~', $res);
  81. return $res;
  82. }
  83. }