/src/Hybridauth.php
PHP | 268 lines | 128 code | 35 blank | 105 comment | 14 complexity | fb7b62d3abe609b3b26f5edfd206f938 MD5 | raw file
- <?php
- /*!
- * Hybridauth
- * https://hybridauth.github.io | https://github.com/hybridauth/hybridauth
- * (c) 2017 Hybridauth authors | https://hybridauth.github.io/license.html
- */
- namespace Hybridauth;
- use Hybridauth\Exception\InvalidArgumentException;
- use Hybridauth\Exception\UnexpectedValueException;
- use Hybridauth\Storage\StorageInterface;
- use Hybridauth\Logger\LoggerInterface;
- use Hybridauth\Logger\Logger;
- use Hybridauth\HttpClient\HttpClientInterface;
- /**
- * Hybridauth\Hybridauth
- *
- * For ease of use of multiple providers, Hybridauth implements the class Hybridauth\Hybridauth,
- * a sort of factory/façade which acts as an unified interface or entry point, and it expects a
- * configuration array containing the list of providers you want to use, their respective credentials
- * and authorized callback.
- */
- class Hybridauth
- {
- /**
- * Hybridauth config.
- *
- * @var array
- */
- protected $config;
- /**
- * Storage.
- *
- * @var StorageInterface
- */
- protected $storage;
- /**
- * HttpClient.
- *
- * @var HttpClientInterface
- */
- protected $httpClient;
- /**
- * Logger.
- *
- * @var LoggerInterface
- */
- protected $logger;
- /**
- * @param array|string $config Array with configuration or Path to PHP file that will return array
- * @param HttpClientInterface $httpClient
- * @param StorageInterface $storage
- * @param LoggerInterface $logger
- *
- * @throws InvalidArgumentException
- */
- public function __construct(
- $config,
- HttpClientInterface $httpClient = null,
- StorageInterface $storage = null,
- LoggerInterface $logger = null
- ) {
- if (is_string($config) && file_exists($config)) {
- $config = include $config;
- } elseif (!is_array($config)) {
- throw new InvalidArgumentException('Hybridauth config does not exist on the given path.');
- }
- $this->config = $config + [
- 'debug_mode' => Logger::NONE,
- 'debug_file' => '',
- 'curl_options' => null,
- 'providers' => []
- ];
- $this->storage = $storage;
- $this->logger = $logger;
- $this->httpClient = $httpClient;
- }
- /**
- * Instantiate the given provider and authentication or authorization protocol.
- *
- * If not authenticated yet, the user will be redirected to the provider's site for
- * authentication/authorisation, otherwise it will simply return an instance of
- * provider's adapter.
- *
- * @param string $name adapter's name (case insensitive)
- *
- * @return \Hybridauth\Adapter\AdapterInterface
- * @throws InvalidArgumentException
- * @throws UnexpectedValueException
- */
- public function authenticate($name)
- {
- $adapter = $this->getAdapter($name);
- $adapter->authenticate();
- return $adapter;
- }
- /**
- * Returns a new instance of a provider's adapter by name
- *
- * @param string $name adapter's name (case insensitive)
- *
- * @return \Hybridauth\Adapter\AdapterInterface
- * @throws InvalidArgumentException
- * @throws UnexpectedValueException
- */
- public function getAdapter($name)
- {
- $config = $this->getProviderConfig($name);
- $adapter = isset($config['adapter']) ? $config['adapter'] : sprintf('Hybridauth\\Provider\\%s', $name);
- if (!class_exists($adapter)) {
- $adapter = null;
- $fs = new \FilesystemIterator(__DIR__ . '/Provider/');
- /** @var \SplFileInfo $file */
- foreach ($fs as $file) {
- if (!$file->isDir()) {
- $provider = strtok($file->getFilename(), '.');
- if ($name === mb_strtolower($provider)) {
- $adapter = sprintf('Hybridauth\\Provider\\%s', $provider);
- break;
- }
- }
- }
- if ($adapter === null) {
- throw new InvalidArgumentException('Unknown Provider.');
- }
- }
- return new $adapter($config, $this->httpClient, $this->storage, $this->logger);
- }
- /**
- * Get provider config by name.
- *
- * @param string $name adapter's name (case insensitive)
- *
- * @throws UnexpectedValueException
- * @throws InvalidArgumentException
- *
- * @return array
- */
- public function getProviderConfig($name)
- {
- $name = strtolower($name);
- $providersConfig = array_change_key_case($this->config['providers'], CASE_LOWER);
- if (!isset($providersConfig[$name])) {
- throw new InvalidArgumentException('Unknown Provider.');
- }
- if (!$providersConfig[$name]['enabled']) {
- throw new UnexpectedValueException('Disabled Provider.');
- }
- $config = $providersConfig[$name];
- $config += [
- 'debug_mode' => $this->config['debug_mode'],
- 'debug_file' => $this->config['debug_file'],
- ];
- if (!isset($config['callback']) && isset($this->config['callback'])) {
- $config['callback'] = $this->config['callback'];
- }
- return $config;
- }
- /**
- * Returns a boolean of whether the user is connected with a provider
- *
- * @param string $name adapter's name (case insensitive)
- *
- * @return bool
- * @throws InvalidArgumentException
- * @throws UnexpectedValueException
- */
- public function isConnectedWith($name)
- {
- return $this->getAdapter($name)->isConnected();
- }
- /**
- * Returns a list of enabled adapters names
- *
- * @return array
- */
- public function getProviders()
- {
- $providers = [];
- foreach ($this->config['providers'] as $name => $config) {
- if ($config['enabled']) {
- $providers[] = $name;
- }
- }
- return $providers;
- }
- /**
- * Returns a list of currently connected adapters names
- *
- * @return array
- * @throws InvalidArgumentException
- * @throws UnexpectedValueException
- */
- public function getConnectedProviders()
- {
- $providers = [];
- foreach ($this->getProviders() as $name) {
- if ($this->isConnectedWith($name)) {
- $providers[] = $name;
- }
- }
- return $providers;
- }
- /**
- * Returns a list of new instances of currently connected adapters
- *
- * @return \Hybridauth\Adapter\AdapterInterface[]
- * @throws InvalidArgumentException
- * @throws UnexpectedValueException
- */
- public function getConnectedAdapters()
- {
- $adapters = [];
- foreach ($this->getProviders() as $name) {
- $adapter = $this->getAdapter($name);
- if ($adapter->isConnected()) {
- $adapters[$name] = $adapter;
- }
- }
- return $adapters;
- }
- /**
- * Disconnect all currently connected adapters at once
- */
- public function disconnectAllAdapters()
- {
- foreach ($this->getProviders() as $name) {
- $adapter = $this->getAdapter($name);
- if ($adapter->isConnected()) {
- $adapter->disconnect();
- }
- }
- }
- }