PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/app/code/Magento/Integration/Model/OauthService.php

https://gitlab.com/crazybutterfly815/magento2
PHP | 294 lines | 187 code | 21 blank | 86 comment | 8 complexity | d6cf9febfc33ef1231cdb46040e9a8d9 MD5 | raw file
  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. 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
  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. __('Unexpected error. Unable to create oAuth consumer account.')
  120. );
  121. }
  122. }
  123. /**
  124. * {@inheritdoc}
  125. */
  126. public function createAccessToken($consumerId, $clearExistingToken = false)
  127. {
  128. try {
  129. $consumer = $this->_consumerFactory->create()->load($consumerId);
  130. $existingToken = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
  131. if ($existingToken && $clearExistingToken) {
  132. $existingToken->delete();
  133. unset($existingToken);
  134. }
  135. } catch (\Exception $e) {
  136. }
  137. if (!isset($existingToken)) {
  138. $consumer = $this->_consumerFactory->create()->load($consumerId);
  139. $this->_tokenFactory->create()->createVerifierToken($consumerId);
  140. $this->_tokenProvider->createRequestToken($consumer);
  141. $this->_tokenProvider->getAccessToken($consumer);
  142. return true;
  143. }
  144. return false;
  145. }
  146. /**
  147. * {@inheritdoc}
  148. */
  149. public function getAccessToken($consumerId)
  150. {
  151. try {
  152. $consumer = $this->_consumerFactory->create()->load($consumerId);
  153. $token = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
  154. if ($token->getType() != OauthTokenModel::TYPE_ACCESS) {
  155. return false;
  156. }
  157. } catch (\Exception $e) {
  158. return false;
  159. }
  160. return $token;
  161. }
  162. /**
  163. * {@inheritdoc}
  164. */
  165. public function loadConsumer($consumerId)
  166. {
  167. try {
  168. return $this->_consumerFactory->create()->load($consumerId);
  169. } catch (\Magento\Framework\Exception\LocalizedException $exception) {
  170. throw $exception;
  171. } catch (\Exception $exception) {
  172. throw new \Magento\Framework\Oauth\Exception(
  173. __('Unexpected error. Unable to load oAuth consumer account.')
  174. );
  175. }
  176. }
  177. /**
  178. * {@inheritdoc}
  179. */
  180. public function loadConsumerByKey($key)
  181. {
  182. try {
  183. return $this->_consumerFactory->create()->load($key, 'key');
  184. } catch (\Magento\Framework\Exception\LocalizedException $exception) {
  185. throw $exception;
  186. } catch (\Exception $exception) {
  187. throw new \Magento\Framework\Oauth\Exception(
  188. __('Unexpected error. Unable to load oAuth consumer account.')
  189. );
  190. }
  191. }
  192. /**
  193. * {@inheritdoc}
  194. */
  195. public function postToConsumer($consumerId, $endpointUrl)
  196. {
  197. try {
  198. $consumer = $this->loadConsumer($consumerId);
  199. $consumer->setUpdatedAt($this->getDateHelper()->gmtDate());
  200. $consumer->save();
  201. if (!$consumer->getId()) {
  202. throw new \Magento\Framework\Oauth\Exception(
  203. __('A consumer with ID %1 does not exist', $consumerId)
  204. );
  205. }
  206. $consumerData = $consumer->getData();
  207. $verifier = $this->_tokenFactory->create()->createVerifierToken($consumerId);
  208. $storeBaseUrl = $this->_storeManager->getStore()->getBaseUrl();
  209. $this->_httpClient->setUri($endpointUrl);
  210. $this->_httpClient->setParameterPost(
  211. [
  212. 'oauth_consumer_key' => $consumerData['key'],
  213. 'oauth_consumer_secret' => $consumerData['secret'],
  214. 'store_base_url' => $storeBaseUrl,
  215. 'oauth_verifier' => $verifier->getVerifier(),
  216. ]
  217. );
  218. $maxredirects = $this->_dataHelper->getConsumerPostMaxRedirects();
  219. $timeout = $this->_dataHelper->getConsumerPostTimeout();
  220. $this->_httpClient->setConfig(['maxredirects' => $maxredirects, 'timeout' => $timeout]);
  221. $this->_httpClient->request(\Magento\Framework\HTTP\ZendClient::POST);
  222. return $verifier->getVerifier();
  223. } catch (\Magento\Framework\Exception\LocalizedException $exception) {
  224. throw $exception;
  225. } catch (\Magento\Framework\Oauth\Exception $exception) {
  226. throw $exception;
  227. } catch (\Exception $exception) {
  228. $this->_logger->critical($exception);
  229. throw new \Magento\Framework\Oauth\Exception(
  230. __('Unable to post data to consumer due to an unexpected error')
  231. );
  232. }
  233. }
  234. /**
  235. * {@inheritdoc}
  236. */
  237. public function deleteConsumer($consumerId)
  238. {
  239. $consumer = $this->_loadConsumerById($consumerId);
  240. $data = $consumer->getData();
  241. $consumer->delete();
  242. return $data;
  243. }
  244. /**
  245. * {@inheritdoc}
  246. */
  247. public function deleteIntegrationToken($consumerId)
  248. {
  249. try {
  250. $consumer = $this->_consumerFactory->create()->load($consumerId);
  251. $existingToken = $this->_tokenProvider->getIntegrationTokenByConsumerId($consumer->getId());
  252. $existingToken->delete();
  253. return true;
  254. } catch (\Exception $e) {
  255. return false;
  256. }
  257. }
  258. /**
  259. * Load consumer by id.
  260. *
  261. * @param int $consumerId
  262. * @return ConsumerModel
  263. * @throws \Magento\Framework\Exception\IntegrationException
  264. */
  265. protected function _loadConsumerById($consumerId)
  266. {
  267. $consumer = $this->_consumerFactory->create()->load($consumerId);
  268. if (!$consumer->getId()) {
  269. throw new IntegrationException(__('Consumer with ID \'%1\' does not exist.', $consumerId));
  270. }
  271. return $consumer;
  272. }
  273. }