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.
zhishifufei_php/vendor/overtrue/socialite/src/SocialiteManager.php

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);
}
}