credentialsAreConfigured($credentials)) { throw new PluginNotConfiguredException('Missing credentials'); } // Return cached initialized client if there is one. if (isset($this->initializedClients[$credentials->getClientId()])) { return $this->initializedClients[$credentials->getClientId()]; } $this->credentials = $credentials; $this->config = $config; $options = [ 'handler' => $this->getStackHandler(), 'auth' => 'oauth', ]; // Set up base URI if it's configured. if (method_exists($credentials, 'getBaseUri') && ($baseUri = $credentials->getBaseUri()) !== null) { $options['base_uri'] = $baseUri; } $this->initializedClients[$credentials->getClientId()] = new Client($options); return $this->initializedClients[$credentials->getClientId()]; } protected function credentialsAreConfigured(CredentialsInterface $credentials): bool { if (empty($credentials->getAuthorizationUrl())) { return false; } if (empty($credentials->getTokenUrl())) { return false; } if (empty($credentials->getClientId())) { return false; } if (empty($credentials->getClientSecret())) { return false; } return true; } private function getStackHandler(): HandlerStack { $reAuthConfig = $this->getReAuthConfig(); $grantType = new AuthorizationCode($this->getReAuthClient(), $reAuthConfig); $refreshTokenGrantType = new RefreshToken($this->getReAuthClient(), $reAuthConfig); $middleware = new OAuth2Middleware($grantType, $refreshTokenGrantType); $this->configureMiddleware($middleware); $stack = HandlerStack::create(); $stack->push($middleware); return $stack; } private function getReAuthClient(): ClientInterface { if ($this->reAuthClient) { return $this->reAuthClient; } $this->reAuthClient = new Client([ 'base_uri' => $this->credentials->getTokenUrl(), ]); return $this->reAuthClient; } private function getReAuthConfig(): array { $config = [ 'client_id' => $this->credentials->getClientId(), 'client_secret' => $this->credentials->getClientSecret(), 'code' => '', ]; if ($this->credentials instanceof ScopeInterface) { $config['scope'] = $this->credentials->getScope(); } if ($this->credentials instanceof RedirectUriInterface) { $config['redirect_uri'] = $this->credentials->getRedirectUri(); } if ($this->credentials instanceof CodeInterface) { $config['code'] = $this->credentials->getCode(); } return $config; } private function configureMiddleware(OAuth2Middleware $oauth): void { if (!$this->config) { return; } if ($this->config instanceof ConfigCredentialsSignerInterface) { $oauth->setClientCredentialsSigner($this->config->getCredentialsSigner()); } if ($this->config instanceof ConfigTokenPersistenceInterface) { $oauth->setTokenPersistence($this->config->getTokenPersistence()); } if ($this->config instanceof ConfigTokenSignerInterface) { $oauth->setAccessTokenSigner($this->config->getTokenSigner()); } if ($this->config instanceof ConfigTokenFactoryInterface) { $oauth->setTokenFactory($this->config->getTokenFactory()); } } }