Spaces:
No application file
No application file
declare(strict_types=1); | |
namespace Mautic\IntegrationsBundle\Auth\Provider\Oauth1aTwoLegged; | |
use GuzzleHttp\Client; | |
use GuzzleHttp\ClientInterface; | |
use GuzzleHttp\HandlerStack; | |
use GuzzleHttp\Subscriber\Oauth\Oauth1; | |
use Mautic\IntegrationsBundle\Auth\Provider\AuthConfigInterface; | |
use Mautic\IntegrationsBundle\Auth\Provider\AuthCredentialsInterface; | |
use Mautic\IntegrationsBundle\Auth\Provider\AuthProviderInterface; | |
use Mautic\IntegrationsBundle\Exception\PluginNotConfiguredException; | |
/** | |
* Factory for building HTTP clients that will sign the requests with Oauth1a headers. | |
*/ | |
class HttpFactory implements AuthProviderInterface | |
{ | |
public const NAME = 'oauth1a_two_legged'; | |
/** | |
* Cache of initialized clients. | |
* | |
* @var Client[] | |
*/ | |
private array $initializedClients = []; | |
public function getAuthType(): string | |
{ | |
return self::NAME; | |
} | |
/** | |
* @param CredentialsInterface|AuthCredentialsInterface $credentials | |
* | |
* @throws PluginNotConfiguredException | |
*/ | |
public function getClient(AuthCredentialsInterface $credentials, ?AuthConfigInterface $config = null): ClientInterface | |
{ | |
// Return cached initialized client if there is one. | |
if (!empty($this->initializedClients[$credentials->getConsumerKey()])) { | |
return $this->initializedClients[$credentials->getConsumerKey()]; | |
} | |
if (!$this->credentialsAreConfigured($credentials)) { | |
throw new PluginNotConfiguredException('Oauth1a Credentials or URL is missing'); | |
} | |
$this->initializedClients[$credentials->getConsumerKey()] = $this->buildClient($credentials); | |
return $this->initializedClients[$credentials->getConsumerKey()]; | |
} | |
private function buildClient(CredentialsInterface $credentials): Client | |
{ | |
$stack = HandlerStack::create(); | |
$stack->push($this->createOauth1($credentials)); | |
return new Client( | |
[ | |
'handler' => $stack, | |
'base_uri' => $credentials->getAuthUrl(), | |
'auth' => 'oauth', | |
] | |
); | |
} | |
private function createOauth1(CredentialsInterface $credentials): Oauth1 | |
{ | |
$config = [ | |
'consumer_key' => $credentials->getConsumerKey(), | |
'consumer_secret' => $credentials->getConsumerSecret(), | |
]; | |
if ($credentials->getToken() && $credentials->getTokenSecret()) { | |
$config['token'] = $credentials->getToken(); | |
$config['token_secret'] = $credentials->getTokenSecret(); | |
} | |
return new Oauth1($config); | |
} | |
private function credentialsAreConfigured(CredentialsInterface $credentials): bool | |
{ | |
return !empty($credentials->getAuthUrl()) && !empty($credentials->getConsumerKey()) && !empty($credentials->getConsumerSecret()); | |
} | |
} | |