AwsAuthV4.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. namespace Elastica\Transport;
  3. use Aws\Credentials\CredentialProvider;
  4. use Aws\Credentials\Credentials;
  5. use Aws\Signature\SignatureV4;
  6. use Elastica\Connection;
  7. use Elastica\Request;
  8. use GuzzleHttp;
  9. use GuzzleHttp\Client;
  10. use GuzzleHttp\HandlerStack;
  11. use GuzzleHttp\Middleware;
  12. use Psr\Http\Message\RequestInterface;
  13. class AwsAuthV4 extends Guzzle
  14. {
  15. protected function _getGuzzleClient($baseUrl, $persistent = true, Request $request)
  16. {
  17. if (!$persistent || !self::$_guzzleClientConnection) {
  18. $stack = HandlerStack::create(GuzzleHttp\choose_handler());
  19. $stack->push($this->getSigningMiddleware(), 'sign');
  20. self::$_guzzleClientConnection = new Client([
  21. 'base_uri' => $baseUrl,
  22. 'handler' => $stack,
  23. 'headers' => [
  24. 'Content-Type' => $request->getContentType(),
  25. ],
  26. ]);
  27. }
  28. return self::$_guzzleClientConnection;
  29. }
  30. protected function _getBaseUrl(Connection $connection)
  31. {
  32. $this->initializePortAndScheme();
  33. return parent::_getBaseUrl($connection);
  34. }
  35. private function getSigningMiddleware()
  36. {
  37. $region = $this->getConnection()->hasParam('aws_region')
  38. ? $this->getConnection()->getParam('aws_region')
  39. : getenv('AWS_REGION');
  40. $signer = new SignatureV4('es', $region);
  41. $credProvider = $this->getCredentialProvider();
  42. return Middleware::mapRequest(function (RequestInterface $req) use (
  43. $signer,
  44. $credProvider
  45. ) {
  46. return $signer->signRequest($req, $credProvider()->wait());
  47. });
  48. }
  49. private function getCredentialProvider()
  50. {
  51. $connection = $this->getConnection();
  52. if ($connection->hasParam('aws_secret_access_key')) {
  53. return CredentialProvider::fromCredentials(new Credentials(
  54. $connection->getParam('aws_access_key_id'),
  55. $connection->getParam('aws_secret_access_key'),
  56. $connection->hasParam('aws_session_token')
  57. ? $connection->getParam('aws_session_token')
  58. : null
  59. ));
  60. }
  61. return CredentialProvider::defaultProvider();
  62. }
  63. private function initializePortAndScheme()
  64. {
  65. $connection = $this->getConnection();
  66. if (true === $this->isSslRequired($connection)) {
  67. $this->_scheme = 'https';
  68. $connection->setPort(443);
  69. } else {
  70. $this->_scheme = 'http';
  71. $connection->setPort(80);
  72. }
  73. }
  74. /**
  75. * @param Connection $conn
  76. * @param bool $default
  77. *
  78. * @return bool
  79. */
  80. private function isSslRequired(Connection $conn, $default = false)
  81. {
  82. return $conn->hasParam('ssl')
  83. ? (bool) $conn->getParam('ssl')
  84. : $default;
  85. }
  86. }