<?php
namespace App\Subscriber;
use App\Entity\Local\AdminUser;
use Oz\ApiNvl\Model\User;
use Doctrine\ORM\EntityManagerInterface;
use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use League\OAuth2\Client\Provider\GenericProvider;
use LogicException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\Security\Http\SecurityEvents;
class AdminAuthenticationSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface
*/
private $em;
/**
* @param EntityManagerInterface $em
*/
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @return array[]
*/
public static function getSubscribedEvents(): array
{
return [
SecurityEvents::INTERACTIVE_LOGIN => ['interactiveLogin', 15],
];
}
/**
* @param InteractiveLoginEvent $interactiveLoginEvent
*
*/
public function interactiveLogin(InteractiveLoginEvent $interactiveLoginEvent): void
{
/** @var User $user */
$user = $interactiveLoginEvent->getAuthenticationToken()->getUser();
if (!$user instanceof AdminUser) {
return;
}
$this->updateAdminUser($user);
}
/**
* @param AdminUser $user
*
* @return void
*/
private function updateAdminUser(AdminUser $user)
{
$params = [
'clientId' => $_ENV['ADMIN_TOKEN_CLIENT_ID'],
'clientSecret' => $_ENV['ADMIN_TOKEN_CLIENT_SECRET'],
'urlAuthorize' => $_ENV['URL_MON_COMPTE'] . '/provider/connect/authorize',
'urlAccessToken' => $_ENV['URL_MON_COMPTE'] . '/provider/connect/token',
'urlResourceOwnerDetails' => $_ENV['URL_MON_COMPTE'] . '/provider/connect/resource',
];
$provider = new GenericProvider($params);
try {
$accessToken = $provider->getAccessToken('client_credentials', [
'scope' => 'api.dynamic.admin.full',
]);
}
catch (IdentityProviderException $e) {
throw new LogicException($e->getMessage());
}
$user->setOauthToken($accessToken);
$this->em->persist($user);
$this->em->flush();
}
}