SignerTest.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. <?php
  2. namespace OSS\Tests;
  3. use OSS\Http\RequestCore;
  4. use OSS\Credentials\Credentials;
  5. use OSS\Signer\SignerV1;
  6. use OSS\Signer\SignerV4;
  7. use OSS\Core\OssUtil;
  8. class SignerTest extends \PHPUnit\Framework\TestCase
  9. {
  10. public function testSignerV1Header()
  11. {
  12. // case 1
  13. $credentials = new Credentials("ak", "sk");
  14. $request = new RequestCore("http://examplebucket.oss-cn-hangzhou.aliyuncs.com");
  15. $request->set_method("PUT");
  16. $bucket = "examplebucket";
  17. $object = "nelson";
  18. $request->add_header("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==");
  19. $request->add_header("Content-Type", "text/html");
  20. $request->add_header("x-oss-meta-author", "alice");
  21. $request->add_header("x-oss-meta-magic", "abracadabra");
  22. $request->add_header("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
  23. $request->add_header("Date", "Wed, 28 Dec 2022 10:27:41 GMT");
  24. $signer = new SignerV1();
  25. $signingOpt = array(
  26. 'bucket' => $bucket,
  27. 'key' => $object,
  28. );
  29. $signer->sign($request, $credentials, $signingOpt);
  30. $signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\n/examplebucket/nelson";
  31. $this->assertEquals($signToString, $signingOpt['string_to_sign']);
  32. $this->assertEquals('OSS ak:kSHKmLxlyEAKtZPkJhG9bZb5k7M=', $request->request_headers['Authorization']);
  33. // case 2
  34. $request2 = new RequestCore("http://examplebucket.oss-cn-hangzhou.aliyuncs.com?acl");
  35. $request2->set_method("PUT");
  36. $request2->add_header("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==");
  37. $request2->add_header("Content-Type", "text/html");
  38. $request2->add_header("x-oss-meta-author", "alice");
  39. $request2->add_header("x-oss-meta-magic", "abracadabra");
  40. $request2->add_header("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
  41. $request2->add_header("Date", "Wed, 28 Dec 2022 10:27:41 GMT");
  42. $signer = new SignerV1();
  43. $signingOpt2 = array(
  44. 'bucket' => $bucket,
  45. 'key' => $object,
  46. );
  47. $signer->sign($request2, $credentials, $signingOpt2);
  48. $signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\n/examplebucket/nelson?acl";
  49. $this->assertEquals($signToString, $signingOpt2['string_to_sign']);
  50. $this->assertEquals('OSS ak:/afkugFbmWDQ967j1vr6zygBLQk=', $request2->request_headers['Authorization']);
  51. // case 3 with non-signed query
  52. $request3 = new RequestCore("http://examplebucket.oss-cn-hangzhou.aliyuncs.com?acl&non-signed-key=value");
  53. $request3->set_method("PUT");
  54. $request3->add_header("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==");
  55. $request3->add_header("Content-Type", "text/html");
  56. $request3->add_header("x-oss-meta-author", "alice");
  57. $request3->add_header("x-oss-meta-magic", "abracadabra");
  58. $request3->add_header("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
  59. $request3->add_header("Date", "Wed, 28 Dec 2022 10:27:41 GMT");
  60. $signingOpt3 = array(
  61. 'bucket' => $bucket,
  62. 'key' => $object,
  63. );
  64. $signer->sign($request3, $credentials, $signingOpt3);
  65. $signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\n/examplebucket/nelson?acl";
  66. $this->assertEquals($signToString, $signingOpt3['string_to_sign']);
  67. $this->assertEquals('OSS ak:/afkugFbmWDQ967j1vr6zygBLQk=', $request3->request_headers['Authorization']);
  68. }
  69. public function testSignerV1HeaderWithToken()
  70. {
  71. // case 1
  72. $credentials = new Credentials("ak", "sk", "token");
  73. $request = new RequestCore("http://examplebucket.oss-cn-hangzhou.aliyuncs.com");
  74. $request->set_method("PUT");
  75. $bucket = "examplebucket";
  76. $object = "nelson";
  77. $request->add_header("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==");
  78. $request->add_header("Content-Type", "text/html");
  79. $request->add_header("x-oss-meta-author", "alice");
  80. $request->add_header("x-oss-meta-magic", "abracadabra");
  81. $request->add_header("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
  82. $request->add_header("Date", "Wed, 28 Dec 2022 10:27:41 GMT");
  83. $signer = new SignerV1();
  84. $signingOpt = array(
  85. 'bucket' => $bucket,
  86. 'key' => $object,
  87. );
  88. $signer->sign($request, $credentials, $signingOpt);
  89. $signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\nx-oss-security-token:token\n/examplebucket/nelson";
  90. $this->assertEquals($signToString, $signingOpt['string_to_sign']);
  91. $this->assertEquals('OSS ak:H3PAlN3Vucn74tPVEqaQC4AnLwQ=', $request->request_headers['Authorization']);
  92. $this->assertEquals('token', $request->request_headers['x-oss-security-token']);
  93. // case 2
  94. $request2 = new RequestCore("http://examplebucket.oss-cn-hangzhou.aliyuncs.com?acl");
  95. $request2->set_method("PUT");
  96. $request2->add_header("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==");
  97. $request2->add_header("Content-Type", "text/html");
  98. $request2->add_header("x-oss-meta-author", "alice");
  99. $request2->add_header("x-oss-meta-magic", "abracadabra");
  100. $request2->add_header("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
  101. $request2->add_header("Date", "Wed, 28 Dec 2022 10:27:41 GMT");
  102. $signer = new SignerV1();
  103. $signingOpt2 = array(
  104. 'bucket' => $bucket,
  105. 'key' => $object,
  106. );
  107. $signer->sign($request2, $credentials, $signingOpt2);
  108. $signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\nx-oss-security-token:token\n/examplebucket/nelson?acl";
  109. $this->assertEquals($signToString, $signingOpt2['string_to_sign']);
  110. $this->assertEquals("OSS ak:yeceHMAsgusDPCR979RJcLtd7RI=", $request2->request_headers['Authorization']);
  111. // case 3 with non-signed query
  112. $request3 = new RequestCore("http://examplebucket.oss-cn-hangzhou.aliyuncs.com?acl&non-signed-key=value");
  113. $request3->set_method("PUT");
  114. $request3->add_header("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==");
  115. $request3->add_header("Content-Type", "text/html");
  116. $request3->add_header("x-oss-meta-author", "alice");
  117. $request3->add_header("x-oss-meta-magic", "abracadabra");
  118. $request3->add_header("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
  119. $request3->add_header("Date", "Wed, 28 Dec 2022 10:27:41 GMT");
  120. $signingOpt3 = array(
  121. 'bucket' => $bucket,
  122. 'key' => $object,
  123. );
  124. $signer->sign($request3, $credentials, $signingOpt3);
  125. $signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\nx-oss-security-token:token\n/examplebucket/nelson?acl";
  126. $this->assertEquals($signToString, $signingOpt3['string_to_sign']);
  127. $this->assertEquals('OSS ak:yeceHMAsgusDPCR979RJcLtd7RI=', $request2->request_headers['Authorization']);
  128. }
  129. public function testSignerV1Presign()
  130. {
  131. $credentials = new Credentials("ak", "sk");
  132. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/key?versionId=versionId");
  133. $request->set_method("GET");
  134. $bucket = "bucket";
  135. $object = "key";
  136. $signer = new SignerV1();
  137. $signingOpt = array(
  138. 'bucket' => $bucket,
  139. 'key' => $object,
  140. 'expiration' => 1699807420,
  141. );
  142. $signer->presign($request, $credentials, $signingOpt);
  143. $parsed_url = parse_url($request->request_url);
  144. $queryString = isset($parsed_url['query']) ? $parsed_url['query'] : '';
  145. $query = array();
  146. parse_str($queryString, $query);
  147. $this->assertEquals('1699807420', $query['Expires']);
  148. $this->assertEquals('ak', $query['OSSAccessKeyId']);
  149. $this->assertEquals('dcLTea+Yh9ApirQ8o8dOPqtvJXQ=', $query['Signature']);
  150. $this->assertEquals('versionId', $query['versionId']);
  151. $this->assertEquals('/key', $parsed_url['path']);
  152. }
  153. public function testSignerV1PresignWithToken()
  154. {
  155. $credentials = new Credentials("ak", "sk", "token");
  156. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/key%2B123?versionId=versionId");
  157. $request->set_method("GET");
  158. $bucket = "bucket";
  159. $object = "key+123";
  160. $signer = new SignerV1();
  161. $signingOpt = array(
  162. 'bucket' => $bucket,
  163. 'key' => $object,
  164. 'expiration' => 1699808204,
  165. );
  166. $signer->presign($request, $credentials, $signingOpt);
  167. $parsed_url = parse_url($request->request_url);
  168. $queryString = isset($parsed_url['query']) ? $parsed_url['query'] : '';
  169. $query = array();
  170. parse_str($queryString, $query);
  171. $this->assertEquals('1699808204', $query['Expires']);
  172. $this->assertEquals('ak', $query['OSSAccessKeyId']);
  173. $this->assertEquals('jzKYRrM5y6Br0dRFPaTGOsbrDhY=', $query['Signature']);
  174. $this->assertEquals('versionId', $query['versionId']);
  175. $this->assertEquals('token', $query['security-token']);
  176. $this->assertEquals('/key%2B123', $parsed_url['path']);
  177. }
  178. public function testSignerV4Header()
  179. {
  180. // case 1
  181. $credentials = new Credentials("ak", "sk");
  182. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/1234%2B-/123/1.txt");
  183. $request->set_method("PUT");
  184. $bucket = "bucket";
  185. $object = "1234+-/123/1.txt";
  186. $request->add_header("x-oss-head1", "value");
  187. $request->add_header("abc", "value");
  188. $request->add_header("ZAbc", "value");
  189. $request->add_header("XYZ", "value");
  190. $request->add_header("content-type", "text/plain");
  191. $request->add_header("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
  192. $request->add_header("Date", gmdate('D, d M Y H:i:s \G\M\T', 1702743657));
  193. $signer = new SignerV4();
  194. $query = array();
  195. $query["param1"] = "value1";
  196. $query["+param1"] = "value3";
  197. $query["|param1"] = "value4";
  198. $query["+param2"] = "";
  199. $query["|param2"] = "";
  200. $query["param2"] = "";
  201. $parsed_url = parse_url($request->request_url);
  202. $parsed_url['query'] = OssUtil::toQueryString($query);;
  203. $request->request_url = OssUtil::unparseUrl($parsed_url);
  204. $signingOpt = array(
  205. 'bucket' => $bucket,
  206. 'key' => $object,
  207. 'region' => 'cn-hangzhou',
  208. 'product' => 'oss',
  209. );
  210. $signer->sign($request, $credentials, $signingOpt);
  211. $authPat = "OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,Signature=e21d18daa82167720f9b1047ae7e7f1ce7cb77a31e8203a7d5f4624fa0284afe";
  212. $this->assertEquals($authPat, $request->request_headers['Authorization']);
  213. }
  214. public function testSignerV4HeaderWithToken()
  215. {
  216. // case 1
  217. $credentials = new Credentials("ak", "sk", "token");
  218. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/1234%2B-/123/1.txt");
  219. $request->set_method("PUT");
  220. $bucket = "bucket";
  221. $object = "1234+-/123/1.txt";
  222. $request->add_header("x-oss-head1", "value");
  223. $request->add_header("abc", "value");
  224. $request->add_header("ZAbc", "value");
  225. $request->add_header("XYZ", "value");
  226. $request->add_header("content-type", "text/plain");
  227. $request->add_header("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
  228. $request->add_header("Date", gmdate('D, d M Y H:i:s \G\M\T', 1702784856));
  229. $signer = new SignerV4();
  230. $query = array();
  231. $query["param1"] = "value1";
  232. $query["+param1"] = "value3";
  233. $query["|param1"] = "value4";
  234. $query["+param2"] = "";
  235. $query["|param2"] = "";
  236. $query["param2"] = "";
  237. $parsed_url = parse_url($request->request_url);
  238. $parsed_url['query'] = OssUtil::toQueryString($query);;
  239. $request->request_url = OssUtil::unparseUrl($parsed_url);
  240. $signingOpt = array(
  241. 'bucket' => $bucket,
  242. 'key' => $object,
  243. 'region' => 'cn-hangzhou',
  244. 'product' => 'oss',
  245. );
  246. $signer->sign($request, $credentials, $signingOpt);
  247. $authPat = "OSS4-HMAC-SHA256 Credential=ak/20231217/cn-hangzhou/oss/aliyun_v4_request,Signature=b94a3f999cf85bcdc00d332fbd3734ba03e48382c36fa4d5af5df817395bd9ea";
  248. $this->assertEquals($authPat, $request->request_headers['Authorization']);
  249. }
  250. public function testSignerV4AdditionalHeaders()
  251. {
  252. // case 1
  253. $credentials = new Credentials("ak", "sk");
  254. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/1234%2B-/123/1.txt");
  255. $request->set_method("PUT");
  256. $bucket = "bucket";
  257. $object = "1234+-/123/1.txt";
  258. $request->add_header("x-oss-head1", "value");
  259. $request->add_header("abc", "value");
  260. $request->add_header("ZAbc", "value");
  261. $request->add_header("XYZ", "value");
  262. $request->add_header("content-type", "text/plain");
  263. $request->add_header("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
  264. $request->add_header("Date", gmdate('D, d M Y H:i:s \G\M\T', 1702747512));
  265. $signer = new SignerV4();
  266. $query = array();
  267. $query["param1"] = "value1";
  268. $query["+param1"] = "value3";
  269. $query["|param1"] = "value4";
  270. $query["+param2"] = "";
  271. $query["|param2"] = "";
  272. $query["param2"] = "";
  273. $parsed_url = parse_url($request->request_url);
  274. $parsed_url['query'] = OssUtil::toQueryString($query);;
  275. $request->request_url = OssUtil::unparseUrl($parsed_url);
  276. $signingOpt = array(
  277. 'bucket' => $bucket,
  278. 'key' => $object,
  279. 'region' => 'cn-hangzhou',
  280. 'product' => 'oss',
  281. 'additionalHeaders' => array("ZAbc", "abc")
  282. );
  283. $signer->sign($request, $credentials, $signingOpt);
  284. $authPat = "OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=abc;zabc,Signature=4a4183c187c07c8947db7620deb0a6b38d9fbdd34187b6dbaccb316fa251212f";
  285. $this->assertEquals($authPat, $request->request_headers['Authorization']);
  286. // case 1
  287. $credentials = new Credentials("ak", "sk");
  288. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/1234%2B-/123/1.txt");
  289. $request->set_method("PUT");
  290. $bucket = "bucket";
  291. $object = "1234+-/123/1.txt";
  292. $request->add_header("x-oss-head1", "value");
  293. $request->add_header("abc", "value");
  294. $request->add_header("ZAbc", "value");
  295. $request->add_header("XYZ", "value");
  296. $request->add_header("content-type", "text/plain");
  297. $request->add_header("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
  298. $request->add_header("Date", gmdate('D, d M Y H:i:s \G\M\T', 1702747512));
  299. $signer = new SignerV4();
  300. $query = array();
  301. $query["param1"] = "value1";
  302. $query["+param1"] = "value3";
  303. $query["|param1"] = "value4";
  304. $query["+param2"] = "";
  305. $query["|param2"] = "";
  306. $query["param2"] = "";
  307. $parsed_url = parse_url($request->request_url);
  308. $parsed_url['query'] = OssUtil::toQueryString($query);;
  309. $request->request_url = OssUtil::unparseUrl($parsed_url);
  310. $signingOpt = array(
  311. 'bucket' => $bucket,
  312. 'key' => $object,
  313. 'region' => 'cn-hangzhou',
  314. 'product' => 'oss',
  315. 'additionalHeaders' => array("x-oss-no-exist", "ZAbc", "x-oss-head1", "abc")
  316. );
  317. $signer->sign($request, $credentials, $signingOpt);
  318. $authPat = "OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=abc;zabc,Signature=4a4183c187c07c8947db7620deb0a6b38d9fbdd34187b6dbaccb316fa251212f";
  319. $this->assertEquals($authPat, $request->request_headers['Authorization']);
  320. }
  321. public function testSignerV4Presign()
  322. {
  323. // case 1
  324. $credentials = new Credentials("ak", "sk");
  325. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/1234%2B-/123/1.txt");
  326. $request->set_method("PUT");
  327. $bucket = "bucket";
  328. $object = "1234+-/123/1.txt";
  329. $request->add_header("x-oss-head1", "value");
  330. $request->add_header("abc", "value");
  331. $request->add_header("ZAbc", "value");
  332. $request->add_header("XYZ", "value");
  333. $request->add_header("content-type", "application/octet-stream");
  334. $request->add_header("Date", gmdate('D, d M Y H:i:s \G\M\T', 1702781677));
  335. $signer = new SignerV4();
  336. $query = array();
  337. $query["param1"] = "value1";
  338. $query["+param1"] = "value3";
  339. $query["|param1"] = "value4";
  340. $query["+param2"] = "";
  341. $query["|param2"] = "";
  342. $query["param2"] = "";
  343. $parsed_url = parse_url($request->request_url);
  344. $parsed_url['query'] = OssUtil::toQueryString($query);;
  345. $request->request_url = OssUtil::unparseUrl($parsed_url);
  346. $signingOpt = array(
  347. 'bucket' => $bucket,
  348. 'key' => $object,
  349. 'region' => 'cn-hangzhou',
  350. 'product' => 'oss',
  351. 'expiration' => 1702782276,
  352. );
  353. $signer->presign($request, $credentials, $signingOpt);
  354. $parsed_url = parse_url($request->request_url);
  355. $queryString = isset($parsed_url['query']) ? $parsed_url['query'] : '';
  356. $query = array();
  357. parse_str($queryString, $query);
  358. $this->assertEquals('OSS4-HMAC-SHA256', $query['x-oss-signature-version']);
  359. $this->assertEquals('OSS4-HMAC-SHA256', $query['x-oss-signature-version']);
  360. $this->assertEquals('599', $query['x-oss-expires']);
  361. $this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $query['x-oss-credential']);
  362. $this->assertEquals('a39966c61718be0d5b14e668088b3fa07601033f6518ac7b523100014269c0fe', $query['x-oss-signature']);
  363. $this->assertFalse(isset($query['x-oss-additional-headers']));
  364. }
  365. public function testSignerV4PresignWithToken()
  366. {
  367. // case 1
  368. $credentials = new Credentials("ak", "sk", "token");
  369. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/1234%2B-/123/1.txt");
  370. $request->set_method("PUT");
  371. $bucket = "bucket";
  372. $object = "1234+-/123/1.txt";
  373. $request->add_header("x-oss-head1", "value");
  374. $request->add_header("abc", "value");
  375. $request->add_header("ZAbc", "value");
  376. $request->add_header("XYZ", "value");
  377. $request->add_header("content-type", "application/octet-stream");
  378. $request->add_header("Date", gmdate('D, d M Y H:i:s \G\M\T', 1702785388));
  379. $signer = new SignerV4();
  380. $query = array();
  381. $query["param1"] = "value1";
  382. $query["+param1"] = "value3";
  383. $query["|param1"] = "value4";
  384. $query["+param2"] = "";
  385. $query["|param2"] = "";
  386. $query["param2"] = "";
  387. $parsed_url = parse_url($request->request_url);
  388. $parsed_url['query'] = OssUtil::toQueryString($query);;
  389. $request->request_url = OssUtil::unparseUrl($parsed_url);
  390. $signingOpt = array(
  391. 'bucket' => $bucket,
  392. 'key' => $object,
  393. 'region' => 'cn-hangzhou',
  394. 'product' => 'oss',
  395. 'expiration' => 1702785987,
  396. );
  397. $signer->presign($request, $credentials, $signingOpt);
  398. $parsed_url = parse_url($request->request_url);
  399. $queryString = isset($parsed_url['query']) ? $parsed_url['query'] : '';
  400. $query = array();
  401. parse_str($queryString, $query);
  402. $this->assertEquals('OSS4-HMAC-SHA256', $query['x-oss-signature-version']);
  403. $this->assertEquals('599', $query['x-oss-expires']);
  404. $this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $query['x-oss-credential']);
  405. $this->assertEquals('3817ac9d206cd6dfc90f1c09c00be45005602e55898f26f5ddb06d7892e1f8b5', $query['x-oss-signature']);
  406. $this->assertFalse(isset($query['x-oss-additional-headers']));
  407. //print($request->request_url);
  408. }
  409. public function testSignerV4PresignWithAdditionalHeaders()
  410. {
  411. // case 1
  412. $credentials = new Credentials("ak", "sk");
  413. $request = new RequestCore("http://bucket.oss-cn-hangzhou.aliyuncs.com/1234%2B-/123/1.txt");
  414. $request->set_method("PUT");
  415. $bucket = "bucket";
  416. $object = "1234+-/123/1.txt";
  417. $request->add_header("x-oss-head1", "value");
  418. $request->add_header("abc", "value");
  419. $request->add_header("ZAbc", "value");
  420. $request->add_header("XYZ", "value");
  421. $request->add_header("content-type", "application/octet-stream");
  422. $request->add_header("Date", gmdate('D, d M Y H:i:s \G\M\T', 1702783809));
  423. $signer = new SignerV4();
  424. $query = array();
  425. $query["param1"] = "value1";
  426. $query["+param1"] = "value3";
  427. $query["|param1"] = "value4";
  428. $query["+param2"] = "";
  429. $query["|param2"] = "";
  430. $query["param2"] = "";
  431. $parsed_url = parse_url($request->request_url);
  432. $parsed_url['query'] = OssUtil::toQueryString($query);;
  433. $request->request_url = OssUtil::unparseUrl($parsed_url);
  434. $signingOpt = array(
  435. 'bucket' => $bucket,
  436. 'key' => $object,
  437. 'region' => 'cn-hangzhou',
  438. 'product' => 'oss',
  439. 'expiration' => 1702784408,
  440. 'additionalHeaders' => array("ZAbc", "abc")
  441. );
  442. $signer->presign($request, $credentials, $signingOpt);
  443. $parsed_url = parse_url($request->request_url);
  444. $queryString = isset($parsed_url['query']) ? $parsed_url['query'] : '';
  445. $query = array();
  446. parse_str($queryString, $query);
  447. $this->assertEquals('OSS4-HMAC-SHA256', $query['x-oss-signature-version']);
  448. $this->assertEquals('20231217T033009Z', $query['x-oss-date']);
  449. $this->assertEquals('599', $query['x-oss-expires']);
  450. $this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $query['x-oss-credential']);
  451. $this->assertEquals('6bd984bfe531afb6db1f7550983a741b103a8c58e5e14f83ea474c2322dfa2b7', $query['x-oss-signature']);
  452. $this->assertEquals('abc;zabc', $query['x-oss-additional-headers']);
  453. }
  454. }