OauthTest.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
  5. * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  6. *
  7. * Licensed under The MIT License
  8. * Redistributions of files must retain the above copyright notice.
  9. *
  10. * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
  11. * @link https://cakephp.org CakePHP(tm) Project
  12. * @since 3.0.0
  13. * @license https://opensource.org/licenses/mit-license.php MIT License
  14. */
  15. namespace Cake\Test\TestCase\Http\Client\Auth;
  16. use Cake\Http\Client\Auth\Oauth;
  17. use Cake\Http\Client\Request;
  18. use Cake\TestSuite\TestCase;
  19. /**
  20. * Oauth test.
  21. */
  22. class OauthTest extends TestCase
  23. {
  24. private $privateKeyString = '-----BEGIN RSA PRIVATE KEY-----
  25. MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALRiMLAh9iimur8V
  26. A7qVvdqxevEuUkW4K+2KdMXmnQbG9Aa7k7eBjK1S+0LYmVjPKlJGNXHDGuy5Fw/d
  27. 7rjVJ0BLB+ubPK8iA/Tw3hLQgXMRRGRXXCn8ikfuQfjUS1uZSatdLB81mydBETlJ
  28. hI6GH4twrbDJCR2Bwy/XWXgqgGRzAgMBAAECgYBYWVtleUzavkbrPjy0T5FMou8H
  29. X9u2AC2ry8vD/l7cqedtwMPp9k7TubgNFo+NGvKsl2ynyprOZR1xjQ7WgrgVB+mm
  30. uScOM/5HVceFuGRDhYTCObE+y1kxRloNYXnx3ei1zbeYLPCHdhxRYW7T0qcynNmw
  31. rn05/KO2RLjgQNalsQJBANeA3Q4Nugqy4QBUCEC09SqylT2K9FrrItqL2QKc9v0Z
  32. zO2uwllCbg0dwpVuYPYXYvikNHHg+aCWF+VXsb9rpPsCQQDWR9TT4ORdzoj+Nccn
  33. qkMsDmzt0EfNaAOwHOmVJ2RVBspPcxt5iN4HI7HNeG6U5YsFBb+/GZbgfBT3kpNG
  34. WPTpAkBI+gFhjfJvRw38n3g/+UeAkwMI2TJQS4n8+hid0uus3/zOjDySH3XHCUno
  35. cn1xOJAyZODBo47E+67R4jV1/gzbAkEAklJaspRPXP877NssM5nAZMU0/O/NGCZ+
  36. 3jPgDUno6WbJn5cqm8MqWhW1xGkImgRk+fkDBquiq4gPiT898jusgQJAd5Zrr6Q8
  37. AO/0isr/3aa6O6NLQxISLKcPDk2NOccAfS/xOtfOz4sJYM3+Bs4Io9+dZGSDCA54
  38. Lw03eHTNQghS0A==
  39. -----END RSA PRIVATE KEY-----';
  40. private $privateKeyStringEnc = '-----BEGIN RSA PRIVATE KEY-----
  41. Proc-Type: 4,ENCRYPTED
  42. DEK-Info: DES-CBC,E65DB7AE7A05EF23
  43. QCXAQ/Uj1+7uQp0MyDUPlKvW/28PhbT4GxflBYmU6SxKZ2CVFPk0M8RgB6gkJyVv
  44. mwjo1Ch2Tlt7/VrNfLWGIh1XPhsC3gatv8Wv+g0keWWifaHlhXulgMGREJ7QeJg0
  45. 5THvdFuIs2qQnOzPCAwONjM6yMxPb2qxvwq0UKAL5V/CYVFWS6PYdR25f9ogXxBz
  46. c3QjvvnhQ7ipNjpjVp/XKYMYnZPCYkNYvRX+BcsWlqYtclO3m+xPG+mPAFs9hnBI
  47. wHI4yC2fl52giRc7XnSl7NNjun6RpHT/Cn7JDH6ql86pgMO0dw6PDzPf0KY9DCrR
  48. ldQyzQ8WjN3FU55+En+8zmSnxUu7EbdqZwhVEF+UwfJ7IqJUnHll0aDTUA/qq0dk
  49. DqtMKIXvRnDVZJqKxHyRvARf8Zp8USsq3cVdlA9PhtcKrs4CbTDL0lJ3eWj1bDS1
  50. kIHXYo19lBqcS1oX+6TqvEs69oW/aG8UZIONN0Xh5TbxuJMedXD1dexV9oOA9lGR
  51. cS6Ye0wC7fCdnA6jfAmHFJ5t2qk7FOzcFZwap7m+EWn11z+72GVqz3BDSe5qH2m2
  52. XOHl59rVtJsZFtjyQEV34IFYyb2qBHHqUUdKwIwT1JOZIq+IdTJxaieIb1mnlmDw
  53. DDf4Kwr0C9tti1R1IsPaAmjF7eH0PGbDGAB3fJSCXbHf7EXTz1AUdknd2MHXQ7wO
  54. UBABkD2ETB+EotdHTly5FQt0jwbHfF2najBmezxtEjIygCnDb02Rtuei4HTansBu
  55. shqoyFXJvizZzje7HaTQv/eJTuA6rUOzu/sAv/eBx2YAPkA8oa3qUw==
  56. -----END RSA PRIVATE KEY-----';
  57. /**
  58. * @return void
  59. */
  60. public function testExceptionUnknownSigningMethod()
  61. {
  62. $this->expectException(\Cake\Core\Exception\Exception::class);
  63. $auth = new Oauth();
  64. $creds = [
  65. 'consumerSecret' => 'it is secret',
  66. 'consumerKey' => 'a key',
  67. 'token' => 'a token value',
  68. 'tokenSecret' => 'also secret',
  69. 'method' => 'silly goose',
  70. ];
  71. $request = new Request();
  72. $auth->authentication($request, $creds);
  73. }
  74. /**
  75. * Test plain-text signing.
  76. *
  77. * @return void
  78. */
  79. public function testPlainTextSigning()
  80. {
  81. $auth = new Oauth();
  82. $creds = [
  83. 'consumerSecret' => 'it is secret',
  84. 'consumerKey' => 'a key',
  85. 'token' => 'a token value',
  86. 'tokenSecret' => 'also secret',
  87. 'method' => 'plaintext',
  88. ];
  89. $request = new Request();
  90. $request = $auth->authentication($request, $creds);
  91. $result = $request->getHeaderLine('Authorization');
  92. $this->assertStringContainsString('OAuth', $result);
  93. $this->assertStringContainsString('oauth_version="1.0"', $result);
  94. $this->assertStringContainsString('oauth_token="a%20token%20value"', $result);
  95. $this->assertStringContainsString('oauth_consumer_key="a%20key"', $result);
  96. $this->assertStringContainsString('oauth_signature_method="PLAINTEXT"', $result);
  97. $this->assertStringContainsString('oauth_signature="it%20is%20secret%26also%20secret"', $result);
  98. $this->assertStringContainsString('oauth_timestamp=', $result);
  99. $this->assertStringContainsString('oauth_nonce=', $result);
  100. }
  101. /**
  102. * Test that baseString() normalizes the URL.
  103. *
  104. * @return void
  105. */
  106. public function testBaseStringNormalizeUrl()
  107. {
  108. $request = new Request('HTTP://exAmple.com:80/parts/foo');
  109. $auth = new Oauth();
  110. $creds = [];
  111. $result = $auth->baseString($request, $creds);
  112. $this->assertStringContainsString('GET&', $result, 'method was missing.');
  113. $this->assertStringContainsString('http%3A%2F%2Fexample.com%2Fparts%2Ffoo', $result);
  114. }
  115. /**
  116. * Test that the query string is stripped from the normalized host.
  117. *
  118. * @return void
  119. */
  120. public function testBaseStringWithQueryString()
  121. {
  122. $request = new Request('http://example.com/search?q=pogo&cat=2');
  123. $auth = new Oauth();
  124. $values = [
  125. 'oauth_version' => '1.0',
  126. 'oauth_nonce' => uniqid(),
  127. 'oauth_timestamp' => time(),
  128. 'oauth_signature_method' => 'HMAC-SHA1',
  129. 'oauth_token' => 'token',
  130. 'oauth_consumer_key' => 'consumer-key',
  131. ];
  132. $result = $auth->baseString($request, $values);
  133. $this->assertStringContainsString('GET&', $result, 'method was missing.');
  134. $this->assertStringContainsString(
  135. 'http%3A%2F%2Fexample.com%2Fsearch&',
  136. $result
  137. );
  138. $this->assertStringContainsString(
  139. 'cat%3D2%26oauth_consumer_key%3Dconsumer-key' .
  140. '%26oauth_nonce%3D' . $values['oauth_nonce'] .
  141. '%26oauth_signature_method%3DHMAC-SHA1' .
  142. '%26oauth_timestamp%3D' . $values['oauth_timestamp'] .
  143. '%26oauth_token%3Dtoken' .
  144. '%26oauth_version%3D1.0' .
  145. '%26q%3Dpogo',
  146. $result
  147. );
  148. }
  149. /**
  150. * Ensure that post data is sorted and encoded.
  151. *
  152. * Keys with array values have to be serialized using
  153. * a more standard HTTP approach. PHP flavoured HTTP
  154. * is not part of the Oauth spec.
  155. *
  156. * See Normalize Request Parameters (section 9.1.1)
  157. *
  158. * @return void
  159. */
  160. public function testBaseStringWithPostDataNestedArrays()
  161. {
  162. $request = new Request(
  163. 'http://example.com/search?q=pogo',
  164. Request::METHOD_POST,
  165. [],
  166. [
  167. 'search' => [
  168. 'filters' => [
  169. 'field' => 'date',
  170. 'value' => 'one two',
  171. ],
  172. ],
  173. ]
  174. );
  175. $auth = new Oauth();
  176. $values = [
  177. 'oauth_version' => '1.0',
  178. 'oauth_nonce' => uniqid(),
  179. 'oauth_timestamp' => time(),
  180. 'oauth_signature_method' => 'HMAC-SHA1',
  181. 'oauth_token' => 'token',
  182. 'oauth_consumer_key' => 'consumer-key',
  183. ];
  184. $result = $auth->baseString($request, $values);
  185. $this->assertStringContainsString('POST&', $result, 'method was missing.');
  186. $this->assertStringContainsString(
  187. 'http%3A%2F%2Fexample.com%2Fsearch&',
  188. $result
  189. );
  190. $this->assertStringContainsString(
  191. '&oauth_consumer_key%3Dconsumer-key' .
  192. '%26oauth_nonce%3D' . $values['oauth_nonce'] .
  193. '%26oauth_signature_method%3DHMAC-SHA1' .
  194. '%26oauth_timestamp%3D' . $values['oauth_timestamp'] .
  195. '%26oauth_token%3Dtoken' .
  196. '%26oauth_version%3D1.0' .
  197. '%26q%3Dpogo' .
  198. '%26search%5Bfilters%5D%5Bfield%5D%3Ddate' .
  199. '%26search%5Bfilters%5D%5Bvalue%5D%3Done%20two',
  200. $result
  201. );
  202. }
  203. /**
  204. * Ensure that post data is sorted and encoded.
  205. *
  206. * Keys with array values have to be serialized using
  207. * a more standard HTTP approach. PHP flavoured HTTP
  208. * is not part of the Oauth spec.
  209. *
  210. * See Normalize Request Parameters (section 9.1.1)
  211. * http://wiki.oauth.net/w/page/12238556/TestCases
  212. *
  213. * @return void
  214. */
  215. public function testBaseStringWithPostData()
  216. {
  217. $request = new Request(
  218. 'http://example.com/search?q=pogo',
  219. Request::METHOD_POST,
  220. [],
  221. [
  222. 'address' => 'post',
  223. 'zed' => 'last',
  224. 'tags' => ['oauth', 'cake'],
  225. ]
  226. );
  227. $auth = new Oauth();
  228. $values = [
  229. 'oauth_version' => '1.0',
  230. 'oauth_nonce' => uniqid(),
  231. 'oauth_timestamp' => time(),
  232. 'oauth_signature_method' => 'HMAC-SHA1',
  233. 'oauth_token' => 'token',
  234. 'oauth_consumer_key' => 'consumer-key',
  235. ];
  236. $result = $auth->baseString($request, $values);
  237. $this->assertStringContainsString('POST&', $result, 'method was missing.');
  238. $this->assertStringContainsString(
  239. 'http%3A%2F%2Fexample.com%2Fsearch&',
  240. $result
  241. );
  242. $this->assertStringContainsString(
  243. '&address%3Dpost' .
  244. '%26oauth_consumer_key%3Dconsumer-key' .
  245. '%26oauth_nonce%3D' . $values['oauth_nonce'] .
  246. '%26oauth_signature_method%3DHMAC-SHA1' .
  247. '%26oauth_timestamp%3D' . $values['oauth_timestamp'] .
  248. '%26oauth_token%3Dtoken' .
  249. '%26oauth_version%3D1.0' .
  250. '%26q%3Dpogo' .
  251. '%26tags%3Dcake' .
  252. '%26tags%3Doauth' .
  253. '%26zed%3Dlast',
  254. $result
  255. );
  256. }
  257. /**
  258. * Ensure that non-urlencoded post data is not included.
  259. *
  260. * Keys with array values have to be serialized using
  261. * a more standard HTTP approach. PHP flavoured HTTP
  262. * is not part of the Oauth spec.
  263. *
  264. * See Normalize Request Parameters (section 9.1.1)
  265. *
  266. * @return void
  267. */
  268. public function testBaseStringWithXmlPostData()
  269. {
  270. $request = new Request(
  271. 'http://example.com/search?q=pogo',
  272. Request::METHOD_POST,
  273. [
  274. 'Content-Type' => 'application/xml',
  275. ],
  276. '<xml>stuff</xml>'
  277. );
  278. $auth = new Oauth();
  279. $values = [
  280. 'oauth_version' => '1.0',
  281. 'oauth_nonce' => uniqid(),
  282. 'oauth_timestamp' => time(),
  283. 'oauth_signature_method' => 'HMAC-SHA1',
  284. 'oauth_token' => 'token',
  285. 'oauth_consumer_key' => 'consumer-key',
  286. ];
  287. $result = $auth->baseString($request, $values);
  288. $this->assertStringContainsString('POST&', $result, 'method was missing.');
  289. $this->assertStringContainsString(
  290. 'http%3A%2F%2Fexample.com%2Fsearch&',
  291. $result
  292. );
  293. $this->assertStringContainsString(
  294. 'oauth_consumer_key%3Dconsumer-key' .
  295. '%26oauth_nonce%3D' . $values['oauth_nonce'] .
  296. '%26oauth_signature_method%3DHMAC-SHA1' .
  297. '%26oauth_timestamp%3D' . $values['oauth_timestamp'] .
  298. '%26oauth_token%3Dtoken' .
  299. '%26oauth_version%3D1.0' .
  300. '%26q%3Dpogo',
  301. $result
  302. );
  303. }
  304. /**
  305. * Test HMAC-SHA1 signing
  306. *
  307. * Hash result + parameters taken from
  308. * http://wiki.oauth.net/w/page/12238556/TestCases
  309. *
  310. * @return void
  311. */
  312. public function testHmacSigning()
  313. {
  314. $request = new Request(
  315. 'http://photos.example.net/photos',
  316. 'GET',
  317. [],
  318. ['file' => 'vacation.jpg', 'size' => 'original']
  319. );
  320. $options = [
  321. 'consumerKey' => 'dpf43f3p2l4k3l03',
  322. 'consumerSecret' => 'kd94hf93k423kf44',
  323. 'tokenSecret' => 'pfkkdhi9sl3r4s00',
  324. 'token' => 'nnch734d00sl2jdk',
  325. 'nonce' => 'kllo9940pd9333jh',
  326. 'timestamp' => '1191242096',
  327. ];
  328. $auth = new Oauth();
  329. $request = $auth->authentication($request, $options);
  330. $result = $request->getHeaderLine('Authorization');
  331. $expected = 'tR3+Ty81lMeYAr/Fid0kMTYa/WM=';
  332. $this->assertStringContainsString(
  333. 'oauth_signature="' . $expected . '"',
  334. urldecode($result)
  335. );
  336. }
  337. /**
  338. * Test RSA-SHA1 signing with a private key string
  339. *
  340. * Hash result + parameters taken from
  341. * http://wiki.oauth.net/w/page/12238556/TestCases
  342. *
  343. * @return void
  344. */
  345. public function testRsaSigningString()
  346. {
  347. $request = new Request(
  348. 'http://photos.example.net/photos',
  349. 'GET',
  350. [],
  351. ['file' => 'vacaction.jpg', 'size' => 'original']
  352. );
  353. $privateKey = $this->privateKeyString;
  354. $options = [
  355. 'method' => 'RSA-SHA1',
  356. 'consumerKey' => 'dpf43f3p2l4k3l03',
  357. 'nonce' => '13917289812797014437',
  358. 'timestamp' => '1196666512',
  359. 'privateKey' => $privateKey,
  360. ];
  361. $auth = new Oauth();
  362. $request = $auth->authentication($request, $options);
  363. $result = $request->getHeaderLine('Authorization');
  364. $expected = 'jvTp/wX1TYtByB1m+Pbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2/9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW//e+RinhejgCuzoH26dyF8iY2ZZ/5D1ilgeijhV/vBka5twt399mXwaYdCwFYE=';
  365. $this->assertStringContainsString(
  366. 'oauth_signature="' . $expected . '"',
  367. urldecode($result)
  368. );
  369. }
  370. /**
  371. * Test RSA-SHA1 signing with a private key file
  372. *
  373. * Hash result + parameters taken from
  374. * http://wiki.oauth.net/w/page/12238556/TestCases
  375. *
  376. * @return void
  377. */
  378. public function testRsaSigningFile()
  379. {
  380. $request = new Request(
  381. 'http://photos.example.net/photos',
  382. 'GET',
  383. [],
  384. ['file' => 'vacaction.jpg', 'size' => 'original']
  385. );
  386. $privateKey = fopen(TEST_APP . DS . 'config' . DS . 'key.pem', 'r');
  387. $options = [
  388. 'method' => 'RSA-SHA1',
  389. 'consumerKey' => 'dpf43f3p2l4k3l03',
  390. 'nonce' => '13917289812797014437',
  391. 'timestamp' => '1196666512',
  392. 'privateKey' => $privateKey,
  393. ];
  394. $auth = new Oauth();
  395. $request = $auth->authentication($request, $options);
  396. $result = $request->getHeaderLine('Authorization');
  397. $expected = 'jvTp/wX1TYtByB1m+Pbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2/9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW//e+RinhejgCuzoH26dyF8iY2ZZ/5D1ilgeijhV/vBka5twt399mXwaYdCwFYE=';
  398. $this->assertStringContainsString(
  399. 'oauth_signature="' . $expected . '"',
  400. urldecode($result)
  401. );
  402. }
  403. /**
  404. * Test RSA-SHA1 signing with a private key file passphrase string
  405. *
  406. * Hash result + parameters taken from
  407. * http://wiki.oauth.net/w/page/12238556/TestCases
  408. *
  409. * @return void
  410. */
  411. public function testRsaSigningWithPassphraseString()
  412. {
  413. $request = new Request(
  414. 'http://photos.example.net/photos',
  415. 'GET',
  416. [],
  417. ['file' => 'vacaction.jpg', 'size' => 'original']
  418. );
  419. $privateKey = fopen(TEST_APP . DS . 'config' . DS . 'key_with_passphrase.pem', 'r');
  420. $passphrase = 'fancy-cakephp-passphrase';
  421. $options = [
  422. 'method' => 'RSA-SHA1',
  423. 'consumerKey' => 'dpf43f3p2l4k3l03',
  424. 'nonce' => '13917289812797014437',
  425. 'timestamp' => '1196666512',
  426. 'privateKey' => $privateKey,
  427. 'privateKeyPassphrase' => $passphrase,
  428. ];
  429. $auth = new Oauth();
  430. $request = $auth->authentication($request, $options);
  431. $result = $request->getHeaderLine('Authorization');
  432. $expected = 'jvTp/wX1TYtByB1m+Pbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2/9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW//e+RinhejgCuzoH26dyF8iY2ZZ/5D1ilgeijhV/vBka5twt399mXwaYdCwFYE=';
  433. $this->assertStringContainsString(
  434. 'oauth_signature="' . $expected . '"',
  435. urldecode($result)
  436. );
  437. }
  438. /**
  439. * Test RSA-SHA1 signing with a private key string and passphrase string
  440. *
  441. * Hash result + parameters taken from
  442. * http://wiki.oauth.net/w/page/12238556/TestCases
  443. *
  444. * @return void
  445. */
  446. public function testRsaSigningStringWithPassphraseString()
  447. {
  448. $request = new Request(
  449. 'http://photos.example.net/photos',
  450. 'GET',
  451. [],
  452. ['file' => 'vacaction.jpg', 'size' => 'original']
  453. );
  454. $privateKey = $this->privateKeyStringEnc;
  455. $passphrase = 'fancy-cakephp-passphrase';
  456. $options = [
  457. 'method' => 'RSA-SHA1',
  458. 'consumerKey' => 'dpf43f3p2l4k3l03',
  459. 'nonce' => '13917289812797014437',
  460. 'timestamp' => '1196666512',
  461. 'privateKey' => $privateKey,
  462. 'privateKeyPassphrase' => $passphrase,
  463. ];
  464. $auth = new Oauth();
  465. $request = $auth->authentication($request, $options);
  466. $result = $request->getHeaderLine('Authorization');
  467. $expected = 'jvTp/wX1TYtByB1m+Pbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2/9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW//e+RinhejgCuzoH26dyF8iY2ZZ/5D1ilgeijhV/vBka5twt399mXwaYdCwFYE=';
  468. $this->assertStringContainsString(
  469. 'oauth_signature="' . $expected . '"',
  470. urldecode($result)
  471. );
  472. }
  473. /**
  474. * Test RSA-SHA1 signing with passphrase file
  475. *
  476. * Hash result + parameters taken from
  477. * http://wiki.oauth.net/w/page/12238556/TestCases
  478. *
  479. * @return void
  480. */
  481. public function testRsaSigningWithPassphraseFile()
  482. {
  483. $this->skipIf(PHP_EOL !== "\n", 'Just the line ending "\n" is supported. You can run the test again e.g. on a linux system.');
  484. $request = new Request(
  485. 'http://photos.example.net/photos',
  486. 'GET',
  487. [],
  488. ['file' => 'vacaction.jpg', 'size' => 'original']
  489. );
  490. $privateKey = fopen(TEST_APP . DS . 'config' . DS . 'key_with_passphrase.pem', 'r');
  491. $passphrase = fopen(TEST_APP . DS . 'config' . DS . 'key_passphrase_lf', 'r');
  492. $options = [
  493. 'method' => 'RSA-SHA1',
  494. 'consumerKey' => 'dpf43f3p2l4k3l03',
  495. 'nonce' => '13917289812797014437',
  496. 'timestamp' => '1196666512',
  497. 'privateKey' => $privateKey,
  498. 'privateKeyPassphrase' => $passphrase,
  499. ];
  500. $auth = new Oauth();
  501. $request = $auth->authentication($request, $options);
  502. $result = $request->getHeaderLine('Authorization');
  503. $expected = 'jvTp/wX1TYtByB1m+Pbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2/9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW//e+RinhejgCuzoH26dyF8iY2ZZ/5D1ilgeijhV/vBka5twt399mXwaYdCwFYE=';
  504. $this->assertStringContainsString(
  505. 'oauth_signature="' . $expected . '"',
  506. urldecode($result)
  507. );
  508. $expected = 0;
  509. $this->assertSame($expected, ftell($passphrase));
  510. }
  511. /**
  512. * Test RSA-SHA1 signing with a private key string and passphrase file
  513. *
  514. * Hash result + parameters taken from
  515. * http://wiki.oauth.net/w/page/12238556/TestCases
  516. *
  517. * @return void
  518. */
  519. public function testRsaSigningStringWithPassphraseFile()
  520. {
  521. $this->skipIf(PHP_EOL !== "\n", 'Just the line ending "\n" is supported. You can run the test again e.g. on a linux system.');
  522. $request = new Request(
  523. 'http://photos.example.net/photos',
  524. 'GET',
  525. [],
  526. ['file' => 'vacaction.jpg', 'size' => 'original']
  527. );
  528. $privateKey = $this->privateKeyStringEnc;
  529. $passphrase = fopen(TEST_APP . DS . 'config' . DS . 'key_passphrase_lf', 'r');
  530. $options = [
  531. 'method' => 'RSA-SHA1',
  532. 'consumerKey' => 'dpf43f3p2l4k3l03',
  533. 'nonce' => '13917289812797014437',
  534. 'timestamp' => '1196666512',
  535. 'privateKey' => $privateKey,
  536. 'privateKeyPassphrase' => $passphrase,
  537. ];
  538. $auth = new Oauth();
  539. $request = $auth->authentication($request, $options);
  540. $result = $request->getHeaderLine('Authorization');
  541. $expected = 'jvTp/wX1TYtByB1m+Pbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2/9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW//e+RinhejgCuzoH26dyF8iY2ZZ/5D1ilgeijhV/vBka5twt399mXwaYdCwFYE=';
  542. $this->assertStringContainsString(
  543. 'oauth_signature="' . $expected . '"',
  544. urldecode($result)
  545. );
  546. $expected = 0;
  547. $this->assertSame($expected, ftell($passphrase));
  548. }
  549. }