You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
5.1 KiB
244 lines
5.1 KiB
9 months ago
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of the overtrue/socialite.
|
||
|
*
|
||
|
* (c) overtrue <i@overtrue.me>
|
||
|
*
|
||
|
* This source file is subject to the MIT license that is bundled
|
||
|
* with this source code in the file LICENSE.
|
||
|
*/
|
||
|
|
||
|
namespace Overtrue\Socialite;
|
||
|
|
||
|
use Closure;
|
||
|
use InvalidArgumentException;
|
||
|
use Symfony\Component\HttpFoundation\Request;
|
||
|
use Symfony\Component\HttpFoundation\Session\Session;
|
||
|
|
||
|
/**
|
||
|
* Class SocialiteManager.
|
||
|
*/
|
||
|
class SocialiteManager implements FactoryInterface
|
||
|
{
|
||
|
/**
|
||
|
* The configuration.
|
||
|
*
|
||
|
* @var \Overtrue\Socialite\Config
|
||
|
*/
|
||
|
protected $config;
|
||
|
|
||
|
/**
|
||
|
* The request instance.
|
||
|
*
|
||
|
* @var Request
|
||
|
*/
|
||
|
protected $request;
|
||
|
|
||
|
/**
|
||
|
* The registered custom driver creators.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $customCreators = [];
|
||
|
|
||
|
/**
|
||
|
* The initial drivers.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $initialDrivers = [
|
||
|
'facebook' => 'Facebook',
|
||
|
'github' => 'GitHub',
|
||
|
'google' => 'Google',
|
||
|
'linkedin' => 'Linkedin',
|
||
|
'weibo' => 'Weibo',
|
||
|
'qq' => 'QQ',
|
||
|
'wechat' => 'WeChat',
|
||
|
'wechat_open' => 'WeChatOpenPlatform',
|
||
|
'douban' => 'Douban',
|
||
|
'wework' => 'WeWork',
|
||
|
];
|
||
|
|
||
|
/**
|
||
|
* The array of created "drivers".
|
||
|
*
|
||
|
* @var ProviderInterface[]
|
||
|
*/
|
||
|
protected $drivers = [];
|
||
|
|
||
|
/**
|
||
|
* SocialiteManager constructor.
|
||
|
*
|
||
|
* @param array $config
|
||
|
* @param Request|null $request
|
||
|
*/
|
||
|
public function __construct(array $config, Request $request = null)
|
||
|
{
|
||
|
$this->config = new Config($config);
|
||
|
|
||
|
if ($request) {
|
||
|
$this->setRequest($request);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set config instance.
|
||
|
*
|
||
|
* @param \Overtrue\Socialite\Config $config
|
||
|
*
|
||
|
* @return $this
|
||
|
*/
|
||
|
public function config(Config $config)
|
||
|
{
|
||
|
$this->config = $config;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a driver instance.
|
||
|
*
|
||
|
* @param string $driver
|
||
|
*
|
||
|
* @return ProviderInterface
|
||
|
*/
|
||
|
public function driver($driver)
|
||
|
{
|
||
|
if (!isset($this->drivers[$driver])) {
|
||
|
$this->drivers[$driver] = $this->createDriver($driver);
|
||
|
}
|
||
|
|
||
|
return $this->drivers[$driver];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param \Symfony\Component\HttpFoundation\Request $request
|
||
|
*
|
||
|
* @return $this
|
||
|
*/
|
||
|
public function setRequest(Request $request)
|
||
|
{
|
||
|
$this->request = $request;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return \Symfony\Component\HttpFoundation\Request
|
||
|
*/
|
||
|
public function getRequest()
|
||
|
{
|
||
|
return $this->request ?: $this->createDefaultRequest();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a new driver instance.
|
||
|
*
|
||
|
* @param string $driver
|
||
|
*
|
||
|
* @throws \InvalidArgumentException
|
||
|
*
|
||
|
* @return ProviderInterface
|
||
|
*/
|
||
|
protected function createDriver($driver)
|
||
|
{
|
||
|
if (isset($this->initialDrivers[$driver])) {
|
||
|
$provider = $this->initialDrivers[$driver];
|
||
|
$provider = __NAMESPACE__.'\\Providers\\'.$provider.'Provider';
|
||
|
|
||
|
return $this->buildProvider($provider, $this->formatConfig($this->config->get($driver)));
|
||
|
}
|
||
|
|
||
|
if (isset($this->customCreators[$driver])) {
|
||
|
return $this->callCustomCreator($driver);
|
||
|
}
|
||
|
|
||
|
throw new InvalidArgumentException("Driver [$driver] not supported.");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Call a custom driver creator.
|
||
|
*
|
||
|
* @param string $driver
|
||
|
*
|
||
|
* @return ProviderInterface
|
||
|
*/
|
||
|
protected function callCustomCreator($driver)
|
||
|
{
|
||
|
return $this->customCreators[$driver]($this->config);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create default request instance.
|
||
|
*
|
||
|
* @return Request
|
||
|
*/
|
||
|
protected function createDefaultRequest()
|
||
|
{
|
||
|
$request = Request::createFromGlobals();
|
||
|
$session = new Session();
|
||
|
|
||
|
$request->setSession($session);
|
||
|
|
||
|
return $request;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register a custom driver creator Closure.
|
||
|
*
|
||
|
* @param string $driver
|
||
|
* @param \Closure $callback
|
||
|
*
|
||
|
* @return $this
|
||
|
*/
|
||
|
public function extend($driver, Closure $callback)
|
||
|
{
|
||
|
$this->customCreators[$driver] = $callback;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all of the created "drivers".
|
||
|
*
|
||
|
* @return ProviderInterface[]
|
||
|
*/
|
||
|
public function getDrivers()
|
||
|
{
|
||
|
return $this->drivers;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Build an OAuth 2 provider instance.
|
||
|
*
|
||
|
* @param string $provider
|
||
|
* @param array $config
|
||
|
*
|
||
|
* @return ProviderInterface
|
||
|
*/
|
||
|
public function buildProvider($provider, $config)
|
||
|
{
|
||
|
return new $provider(
|
||
|
$this->getRequest(), $config['client_id'],
|
||
|
$config['client_secret'], $config['redirect']
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Format the server configuration.
|
||
|
*
|
||
|
* @param array $config
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function formatConfig(array $config)
|
||
|
{
|
||
|
return array_merge([
|
||
|
'identifier' => $config['client_id'],
|
||
|
'secret' => $config['client_secret'],
|
||
|
'callback_uri' => $config['redirect'],
|
||
|
], $config);
|
||
|
}
|
||
|
}
|