HTTPSignatureTest.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace Tests\Unit;
  3. use Tests\TestCase;
  4. use GuzzleHttp\Client;
  5. use GuzzleHttp\Handler\CurlHandler;
  6. use GuzzleHttp\Handler\MockHandler;
  7. use GuzzleHttp\HandlerStack;
  8. use GuzzleHttp\Middleware;
  9. use GuzzleHttp\Psr7\Request;
  10. use GuzzleHttp\Psr7\Response;
  11. use HttpSignatures\Context;
  12. use HttpSignatures\GuzzleHttpSignatures;
  13. class HTTPSignatureTest extends TestCase
  14. {
  15. /**
  16. * @var Context
  17. */
  18. private $context;
  19. /**
  20. * @var Client
  21. */
  22. private $client;
  23. /**
  24. * @var
  25. */
  26. private $history = [];
  27. public function testLibraryInstalled()
  28. {
  29. $this->assertTrue(class_exists('\GuzzleHttp\Client'));
  30. $this->assertTrue(class_exists('\HttpSignatures\Context'));
  31. $this->assertTrue(class_exists('\HttpSignatures\GuzzleHttpSignatures'));
  32. }
  33. public function setUp()
  34. {
  35. $this->context = new Context([
  36. 'keys' => ['pda' => 'secret'],
  37. 'algorithm' => 'hmac-sha256',
  38. 'headers' => ['(request-target)', 'date'],
  39. ]);
  40. $stack = new HandlerStack();
  41. $stack->setHandler(new MockHandler([
  42. new Response(200, ['Content-Length' => 0]),
  43. ]));
  44. $stack->push(GuzzleHttpSignatures::middlewareFromContext($this->context));
  45. $stack->push(Middleware::history($this->history));
  46. $this->client = new Client(['handler' => $stack]);
  47. }
  48. /**
  49. * test signing a message
  50. */
  51. public function testGuzzleRequestHasExpectedHeaders()
  52. {
  53. $this->client->get('/path?query=123', [
  54. 'headers' => ['date' => 'today', 'accept' => 'llamas']
  55. ]);
  56. // get last request
  57. $message = end($this->history);
  58. /** @var Request $request */
  59. $request = $message['request'];
  60. /** @var Response $response */
  61. $response = $message['request'];
  62. $expectedString = implode(
  63. ',',
  64. [
  65. 'keyId="pda"',
  66. 'algorithm="hmac-sha256"',
  67. 'headers="(request-target) date"',
  68. 'signature="SFlytCGpsqb/9qYaKCQklGDvwgmrwfIERFnwt+yqPJw="',
  69. ]
  70. );
  71. $this->assertEquals(
  72. [$expectedString],
  73. $request->getHeader('Signature')
  74. );
  75. $this->assertEquals(
  76. ['Signature ' . $expectedString],
  77. $request->getHeader('Authorization')
  78. );
  79. }
  80. /**
  81. * test signing a message with a URL that doesn't contain a ?query
  82. */
  83. public function testGuzzleRequestHasExpectedHeaders2()
  84. {
  85. $this->client->get('/path', [
  86. 'headers' => ['date' => 'today', 'accept' => 'llamas']
  87. ]);
  88. // get last request
  89. $message = end($this->history);
  90. /** @var Request $request */
  91. $request = $message['request'];
  92. /** @var Response $response */
  93. $response = $message['request'];
  94. $expectedString = implode(
  95. ',',
  96. [
  97. 'keyId="pda"',
  98. 'algorithm="hmac-sha256"',
  99. 'headers="(request-target) date"',
  100. 'signature="DAtF133khP05pS5Gh8f+zF/UF7mVUojMj7iJZO3Xk4o="',
  101. ]
  102. );
  103. $this->assertEquals(
  104. [$expectedString],
  105. $request->getHeader('Signature')
  106. );
  107. $this->assertEquals(
  108. ['Signature ' . $expectedString],
  109. $request->getHeader('Authorization')
  110. );
  111. }
  112. public function getVerifyGuzzleRequestVectors()
  113. {
  114. return [
  115. /* path, headers */
  116. ['/path?query=123', ['date' => 'today', 'accept' => 'llamas']],
  117. ['/path?z=zebra&a=antelope', ['date' => 'today']],
  118. ];
  119. }
  120. /**
  121. * @dataProvider getVerifyGuzzleRequestVectors
  122. * @param string $path
  123. * @param array $headers
  124. */
  125. public function testVerifyGuzzleRequest($path, $headers)
  126. {
  127. $this->client->get($path, ['headers' => $headers]);
  128. // get last request
  129. $message = end($this->history);
  130. /** @var Request $request */
  131. $request = $message['request'];
  132. /** @var Response $response */
  133. $response = $message['request'];
  134. $this->assertTrue($this->context->verifier()->isValid($request));
  135. }
  136. }