@ -34,14 +34,19 @@ use vierbergenlars\AuthserverOAuthAccountBundle\ResourceOwner\ResourceOwnerConfi
class AuthserverOAuthAccountExtension extends Extension implements PrependExtensionInterface
class AuthserverOAuthAccountExtension extends Extension implements PrependExtensionInterface
{
{
const USER_PROVIDER_SERVICE = 'vierbergenlars.authserver_oauth_account.user_provider';
const USER_PROVIDER_SERVICE = 'vierbergenlars.authserver_oauth_account.user_provider';
const RESOURCE_OWNER_MAP_SERVICE = 'vierbergenlars.authserver_oauth_account.resource_owner_map';
public function prepend(ContainerBuilder $container)
public function prepend(ContainerBuilder $container)
{
{
$container->prependExtensionConfig('hwi_oauth', [
$container->prependExtensionConfig('hwi_oauth', [
'firewall_names' => ['public'],
'firewall_names' => [
'public'
],
'connect' => [
'connect' => [
'account_connector' => self::USER_PROVIDER_SERVICE,
'account_connector' => self::USER_PROVIDER_SERVICE
]
]
]);
]);
@ -50,46 +55,45 @@ class AuthserverOAuthAccountExtension extends Extension implements PrependExtens
$processor = new Processor();
$processor = new Processor();
$config = $processor->processConfiguration(new Configuration(), $configs);
$config = $processor->processConfiguration(new Configuration(), $configs);
$container->prependExtensionConfig('hwi_oauth', [
$container->prependExtensionConfig('hwi_oauth', [
'resource_owners' => array_map(function($resource_owner) {
'resource_owners' => array_map(function ($resource_owner) {
return $resource_owner['config'];
return $resource_owner['config'];
}, $config['resource_owners']),
}, $config['resource_owners'])
]);
]);
$container->loadFromExtension('security', [
$container->loadFromExtension('security', [
'firewalls' => [
'firewalls' => [
'public' => [
'public' => [
'oauth' => [
'oauth' => [
'resource_owners' => array_combine(array_keys($config['resource_owners']), array_map(function($roName) {
'resource_owners' => array_combine(array_keys($config['resource_owners']), array_map(function ($roName) {
return '/login/oauth/'.$roName;
return '/login/oauth/' . $roName;
}, array_keys($config['resource_owners']))),
}, array_keys($config['resource_owners']))),
'login_path' => 'app_login',
'login_path' => 'app_login',
'failure_path' => 'app_login',
'failure_path' => 'app_login',
'oauth_user_provider' => [
'oauth_user_provider' => [
'service' => self::USER_PROVIDER_SERVICE,
'service' => self::USER_PROVIDER_SERVICE
],
]
],
]
]
]
],
]
]);
]);
}
}
public function load(array $configs, ContainerBuilder $container)
public function load(array $configs, ContainerBuilder $container)
{
{
$servicesDirectory = __DIR__.'/../Resources/config';
$servicesDirectory = __DIR__ . '/../Resources/config';
$fileLocator = new FileLocator($servicesDirectory);
$fileLocator = new FileLocator($servicesDirectory);
$xmlLoader = new Loader\XmlFileLoader($container, $fileLocator);
$xmlLoader = new Loader\XmlFileLoader($container, $fileLocator);
$xmlLoader->load('services.xml');
$xmlLoader->load('services.xml');
$processor = new Processor();
$processor = new Processor();
$config = $processor->processConfiguration(new Configuration(), $configs);
$config = $processor->processConfiguration(new Configuration(), $configs);
$container->getDefinition(self::RESOURCE_OWNER_MAP_SERVICE)->setArgument(0, $config['resource_owners']);
foreach($config['resource_owners'] as $name => $config)
foreach ($config['resource_owners'] as $name => $config) {
{
$service = new DefinitionDecorator('vierbergenlars.authserver_oauth_account.external_account_provider.abstract');
$service = new DefinitionDecorator('vierbergenlars.authserver_oauth_account.external_account_provider.abstract');
$service->replaceArgument(0, $name);
$service->replaceArgument(0, $name);
$service->replaceArgument(1, $config);
$service->addTag(AuthserverExternalAccountBundle::EXTERNAL_ACCOUNT_PROVIDER_TAG);
$service->addTag(AuthserverExternalAccountBundle::EXTERNAL_ACCOUNT_PROVIDER_TAG);
$container->setDefinition('vierbergenlars.authserver_oauth_account.external_account_provider.impl.'.$name, $service);
$container->setDefinition('vierbergenlars.authserver_oauth_account.external_account_provider.impl.' . $name, $service);
}
}
}
}