* array ( * 'key' => 'ajdsjashgdkahsdlkjasldkjals', //consumer key * 'secret' => 'alsjdlaskjdlaksjdlasjkdlas', //consumer secret * 'verifier' => 'oiudioqueoiquweoiqwueoqwuii' * 'consumer' => $consumer, // retrieved consumer Model * 'token' => $token // retrieved token Model * ); * */ public static function getConsumerCredentials($date = null) { $integration = self::_createIntegration('all'); $objectManager = Bootstrap::getObjectManager(); /** @var $oauthService \Magento\Integration\Api\OauthServiceInterface */ $oauthService = $objectManager->get(\Magento\Integration\Api\OauthServiceInterface::class); $consumer = $oauthService->loadConsumer($integration->getConsumerId()); $url = TESTS_BASE_URL; $consumer->setCallbackUrl($url); $consumer->setRejectedCallbackUrl($url); if ($date !== null) { $consumer->setCreatedAt($date); } $consumer->save(); $token = $objectManager->create(\Magento\Integration\Model\Oauth\Token::class); $verifier = $token->createVerifierToken($consumer->getId())->getVerifier(); return [ 'key' => $consumer->getKey(), 'secret' => $consumer->getSecret(), 'verifier' => $verifier, 'consumer' => $consumer, 'token' => $token ]; } /** * Create an access token to associated to a consumer to access APIs. No resources are available to this consumer. * * @return array comprising of token key and secret *
* array (
* 'key' => 'ajdsjashgdkahsdlkjasldkjals', //token key
* 'secret' => 'alsjdlaskjdlaksjdlasjkdlas', //token secret
* 'oauth_client' => $oauthClient // OauthClient instance used to fetch the access token
* );
*
*/
public static function getAccessToken()
{
$consumerCredentials = self::getConsumerCredentials();
$credentials = new Credentials($consumerCredentials['key'], $consumerCredentials['secret'], TESTS_BASE_URL);
$oAuthClient = new OauthClient($credentials);
$requestToken = $oAuthClient->requestRequestToken();
$accessToken = $oAuthClient->requestAccessToken(
$requestToken->getRequestToken(),
$consumerCredentials['verifier'],
$requestToken->getRequestTokenSecret()
);
/** TODO: Reconsider return format. It is not aligned with method name. */
return [
'key' => $accessToken->getAccessToken(),
'secret' => $accessToken->getAccessTokenSecret(),
'oauth_client' => $oAuthClient
];
}
/**
* Create an access token, tied to integration which has permissions to all API resources in the system.
*
* @param array $resources list of resources to grant to the integration
* @param \Magento\Integration\Model\Integration|null $integrationModel
* @return array
*
* array (
* 'key' => 'ajdsjashgdkahsdlkjasldkjals', //token key
* 'secret' => 'alsjdlaskjdlaksjdlasjkdlas', //token secret
* 'oauth_client' => $oauthClient // OauthClient instance used to fetch the access token
* 'integration' => $integration // Integration instance associated with access token
* );
*
* @throws LogicException
*/
public static function getApiAccessCredentials($resources = null, Integration $integrationModel = null)
{
if (!self::$_apiCredentials) {
$integration = $integrationModel === null ? self::_createIntegration($resources) : $integrationModel;
$objectManager = Bootstrap::getObjectManager();
/** @var \Magento\Integration\Api\OauthServiceInterface $oauthService */
$oauthService = $objectManager->get(\Magento\Integration\Api\OauthServiceInterface::class);
$oauthService->createAccessToken($integration->getConsumerId());
$accessToken = $oauthService->getAccessToken($integration->getConsumerId());
if (!$accessToken) {
throw new LogicException('Access token was not created.');
}
$consumer = $oauthService->loadConsumer($integration->getConsumerId());
$credentials = new Credentials($consumer->getKey(), $consumer->getSecret(), TESTS_BASE_URL);
/** @var $oAuthClient OauthClient */
$oAuthClient = new OauthClient($credentials);
self::$_apiCredentials = [
'key' => $accessToken->getToken(),
'secret' => $accessToken->getSecret(),
'oauth_client' => $oAuthClient,
'integration' => $integration,
];
}
return self::$_apiCredentials;
}
/**
* Forget API access credentials.
*/
public static function clearApiAccessCredentials()
{
self::$_apiCredentials = false;
}
/**
* Remove fs element with nested elements.
*
* @param string $dir
* @param bool $doSaveRoot
*/
protected static function _rmRecursive($dir, $doSaveRoot = false)
{
if (is_dir($dir)) {
foreach (glob($dir . '/*') as $object) {
if (is_dir($object)) {
self::_rmRecursive($object);
} else {
unlink($object);
}
}
if (!$doSaveRoot) {
rmdir($dir);
}
} else {
unlink($dir);
}
}
/**
* Create integration instance.
*
* @param array $resources
* @return \Magento\Integration\Model\Integration
* @throws \Zend\Stdlib\Exception\LogicException
*/
protected static function _createIntegration($resources)
{
$objectManager = Bootstrap::getObjectManager();
/** @var $integrationService \Magento\Integration\Api\IntegrationServiceInterface */
$integrationService = $objectManager->get(\Magento\Integration\Api\IntegrationServiceInterface::class);
$params = ['name' => 'Integration' . microtime()];
if ($resources === null || $resources == 'all') {
$params['all_resources'] = true;
} else {
$params['resource'] = $resources;
}
$integration = $integrationService->create($params);
$integration->setStatus(\Magento\Integration\Model\Integration::STATUS_ACTIVE)->save();
/** Magento cache must be cleared to activate just created ACL role. */
$varPath = realpath(BP . '/var');
if (!$varPath) {
throw new LogicException("Magento cache cannot be cleared after new ACL role creation.");
} else {
$cachePath = $varPath . '/cache';
if (is_dir($cachePath)) {
self::_rmRecursive($cachePath, true);
}
}
return $integration;
}
}