OauthService.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Integration\Model;
  7. use Magento\Framework\Oauth\Helper\Oauth as OauthHelper;
  8. use Magento\Integration\Helper\Oauth\Data as IntegrationOauthHelper;
  9. use Magento\Integration\Model\Oauth\Consumer as ConsumerModel;
  10. use Magento\Integration\Model\Oauth\ConsumerFactory;
  11. use Magento\Integration\Model\Oauth\Token as OauthTokenModel;
  12. use Magento\Integration\Model\Oauth\TokenFactory as TokenFactory;
  13. use Magento\Integration\Model\Oauth\Token\Provider as TokenProvider;
  14. use Magento\Framework\Exception\IntegrationException;
  15. /**
  16. * Integration oAuth service.
  17. *
  18. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  19. */
  20. class OauthService implements \Magento\Integration\Api\OauthServiceInterface
  21. {
  22. /**
  23. * @var \Magento\Store\Model\StoreManagerInterface
  24. */
  25. protected $_storeManager;
  26. /**
  27. * @var ConsumerFactory
  28. */
  29. protected $_consumerFactory;
  30. /**
  31. * @var TokenFactory
  32. */
  33. protected $_tokenFactory;
  34. /**
  35. * @var IntegrationOauthHelper
  36. */
  37. protected $_dataHelper;
  38. /**
  39. * @var \Magento\Framework\HTTP\ZendClient
  40. */
  41. protected $_httpClient;
  42. /**
  43. * @var \Psr\Log\LoggerInterface
  44. */
  45. protected $_logger;
  46. /**
  47. * @var OauthHelper
  48. */
  49. protected $_oauthHelper;
  50. /**
  51. * @var TokenProvider
  52. */
  53. protected $_tokenProvider;
  54. /**
  55. * @var \Magento\Framework\Stdlib\DateTime\DateTime
  56. */
  57. private $_dateHelper;
  58. /**
  59. * Initialize dependencies.
  60. *
  61. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  62. * @param ConsumerFactory $consumerFactory
  63. * @param TokenFactory $tokenFactory
  64. * @param IntegrationOauthHelper $dataHelper
  65. * @param \Magento\Framework\HTTP\ZendClient $httpClient
  66. * @param \Psr\Log\LoggerInterface $logger
  67. * @param OauthHelper $oauthHelper
  68. * @param TokenProvider $tokenProvider
  69. */
  70. public function __construct(
  71. \Magento\Store\Model\StoreManagerInterface $storeManager,
  72. ConsumerFactory $consumerFactory,
  73. TokenFactory $tokenFactory,
  74. IntegrationOauthHelper $dataHelper,
  75. \Magento\Framework\HTTP\ZendClient $httpClient,
  76. \Psr\Log\LoggerInterface $logger,
  77. OauthHelper $oauthHelper,
  78. TokenProvider $tokenProvider
  79. ) {
  80. $this->_storeManager = $storeManager;
  81. $this->_consumerFactory = $consumerFactory;
  82. $this->_tokenFactory = $tokenFactory;
  83. $this->_dataHelper = $dataHelper;
  84. $this->_httpClient = $httpClient;
  85. $this->_logger = $logger;
  86. $this->_oauthHelper = $oauthHelper;
  87. $this->_tokenProvider = $tokenProvider;
  88. }
  89. /**
  90. * The getter function to get the new DateTime dependency
  91. *
  92. * @return \Magento\Framework\Stdlib\DateTime\DateTime
  93. *
  94. * @deprecated 100.0.6
  95. */
  96. private function getDateHelper()
  97. {
  98. if ($this->_dateHelper === null) {
  99. $this->_dateHelper = \Magento\Framework\App\ObjectManager::getInstance()
  100. ->get(\Magento\Framework\Stdlib\DateTime\DateTime::class);
  101. }
  102. return $this->_dateHelper;
  103. }
  104. /**
  105. * {@inheritdoc}
  106. */
  107. public function createConsumer($consumerData)
  108. {
  109. try {
  110. $consumerData['key'] = $this->_oauthHelper->generateConsumerKey();
  111. $consumerData['secret'] = $this->_oauthHelper->generateConsumerSecret();
  112. $consumer = $this->_consumerFactory->create()->setData($consumerData);
  113. $consumer->save();
  114. return $consumer;
  115. } catch (\Magento\Framework\Exception\LocalizedException $exception) {
  116. throw $exception;
  117. } catch (\Exception $exception) {
  118. throw new \Magento\Framework\Oauth\Exception(
  119. __(
  120. "The oAuth consumer account couldn't be created due to an unexpected error. Please try again later."
  121. )
  122. );
  123. }
  124. }
  125. /**
  126. * {@inheritdoc}
  127. */
  128. public function createAccessToken($consumerId, $clearExistingToken = false)
  129. {
  130. try {
  131. $consumer = $this->_consumerFactory->create()->load($consumerId);
  132. $existingToken = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
  133. if ($existingToken && $clearExistingToken) {
  134. $existingToken->delete();
  135. unset($existingToken);
  136. }
  137. } catch (\Exception $e) {
  138. }
  139. if (!isset($existingToken)) {
  140. $consumer = $this->_consumerFactory->create()->load($consumerId);
  141. $this->_tokenFactory->create()->createVerifierToken($consumerId);
  142. $this->_tokenProvider->createRequestToken($consumer);
  143. $this->_tokenProvider->getAccessToken($consumer);
  144. return true;
  145. }
  146. return false;
  147. }
  148. /**
  149. * {@inheritdoc}
  150. */
  151. public function getAccessToken($consumerId)
  152. {
  153. try {
  154. $consumer = $this->_consumerFactory->create()->load($consumerId);
  155. $token = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
  156. if ($token->getType() != OauthTokenModel::TYPE_ACCESS) {
  157. return false;
  158. }
  159. } catch (\Exception $e) {
  160. return false;
  161. }
  162. return $token;
  163. }
  164. /**
  165. * {@inheritdoc}
  166. */
  167. public function loadConsumer($consumerId)
  168. {
  169. try {
  170. return $this->_consumerFactory->create()->load($consumerId);
  171. } catch (\Magento\Framework\Exception\LocalizedException $exception) {
  172. throw $exception;
  173. } catch (\Exception $exception) {
  174. throw new \Magento\Framework\Oauth\Exception(
  175. __("The oAuth consumer account couldn't be loaded due to an unexpected error. Please try again later.")
  176. );
  177. }
  178. }
  179. /**
  180. * {@inheritdoc}
  181. */
  182. public function loadConsumerByKey($key)
  183. {
  184. try {
  185. return $this->_consumerFactory->create()->load($key, 'key');
  186. } catch (\Magento\Framework\Exception\LocalizedException $exception) {
  187. throw $exception;
  188. } catch (\Exception $exception) {
  189. throw new \Magento\Framework\Oauth\Exception(
  190. __("The oAuth consumer account couldn't be loaded due to an unexpected error. Please try again later.")
  191. );
  192. }
  193. }
  194. /**
  195. * {@inheritdoc}
  196. */
  197. public function postToConsumer($consumerId, $endpointUrl)
  198. {
  199. try {
  200. $consumer = $this->loadConsumer($consumerId);
  201. $consumer->setUpdatedAt($this->getDateHelper()->gmtDate());
  202. $consumer->save();
  203. if (!$consumer->getId()) {
  204. throw new \Magento\Framework\Oauth\Exception(
  205. __('A consumer with "%1" ID doesn\'t exist. Verify the ID and try again.', $consumerId)
  206. );
  207. }
  208. $consumerData = $consumer->getData();
  209. $verifier = $this->_tokenFactory->create()->createVerifierToken($consumerId);
  210. $storeBaseUrl = $this->_storeManager->getStore()->getBaseUrl();
  211. $this->_httpClient->setUri($endpointUrl);
  212. $this->_httpClient->setParameterPost(
  213. [
  214. 'oauth_consumer_key' => $consumerData['key'],
  215. 'oauth_consumer_secret' => $consumerData['secret'],
  216. 'store_base_url' => $storeBaseUrl,
  217. 'oauth_verifier' => $verifier->getVerifier(),
  218. ]
  219. );
  220. $maxredirects = $this->_dataHelper->getConsumerPostMaxRedirects();
  221. $timeout = $this->_dataHelper->getConsumerPostTimeout();
  222. $this->_httpClient->setConfig(['maxredirects' => $maxredirects, 'timeout' => $timeout]);
  223. $this->_httpClient->request(\Magento\Framework\HTTP\ZendClient::POST);
  224. return $verifier->getVerifier();
  225. } catch (\Magento\Framework\Exception\LocalizedException $exception) {
  226. throw $exception;
  227. } catch (\Magento\Framework\Oauth\Exception $exception) {
  228. throw $exception;
  229. } catch (\Exception $exception) {
  230. $this->_logger->critical($exception);
  231. throw new \Magento\Framework\Oauth\Exception(
  232. __('The attempt to post data to consumer failed due to an unexpected error. Please try again later.')
  233. );
  234. }
  235. }
  236. /**
  237. * {@inheritdoc}
  238. */
  239. public function deleteConsumer($consumerId)
  240. {
  241. $consumer = $this->_loadConsumerById($consumerId);
  242. $data = $consumer->getData();
  243. $consumer->delete();
  244. return $data;
  245. }
  246. /**
  247. * {@inheritdoc}
  248. */
  249. public function deleteIntegrationToken($consumerId)
  250. {
  251. try {
  252. $consumer = $this->_consumerFactory->create()->load($consumerId);
  253. $existingToken = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
  254. $existingToken->delete();
  255. return true;
  256. } catch (\Exception $e) {
  257. return false;
  258. }
  259. }
  260. /**
  261. * Load consumer by id.
  262. *
  263. * @param int $consumerId
  264. * @return ConsumerModel
  265. * @throws \Magento\Framework\Exception\IntegrationException
  266. */
  267. protected function _loadConsumerById($consumerId)
  268. {
  269. $consumer = $this->_consumerFactory->create()->load($consumerId);
  270. if (!$consumer->getId()) {
  271. throw new IntegrationException(
  272. __('A consumer with ID "%1" doesn\'t exist. Verify the ID and try again.', $consumerId)
  273. );
  274. }
  275. return $consumer;
  276. }
  277. }