<?php
namespace App\Security;
// use App\Repository\UserRepository;
// use Symfony\Component\HttpClient\HttpClient;
use App\Repository\UserRepository;
use Symfony\Component\HttpFoundation\Request;
// use Symfony\Component\Security\Core\Security;
use Symfony\Component\Routing\RouterInterface;
// use League\OAuth2\Client\Provider\AzureResourceOwner;
// use League\OAuth2\Client\Token\AccessToken;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
// use App\Security\Exception\NotVerifiedEmailException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Http\Util\TargetPathTrait;
// use TheNetworg\OAuth2\Client\Provider\AzureResourceOwner;
use TheNetworg\OAuth2\Client\Provider\AzureResourceOwner;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class AzureAuthenticator extends SocialAuthenticator
{
use TargetPathTrait;
private $router;
private $clientRegistry;
private $userRepository;
public function __construct(RouterInterface $router, ClientRegistry $clientRegistry, UserRepository $userRepository)
{
$this->router = $router;
$this->clientRegistry = $clientRegistry;
$this->userRepository = $userRepository;
}
public function start(Request $request, AuthenticationException $authException = null)
{
return new RedirectResponse($this->router->generate('app_login'));
}
// /**
// * Si la route correspond à celle attendue, alors on déclenche cet authenticator
// **/
public function supports(Request $request)
{
return 'oauth_check' === $request->attributes->get('_route') && $request->get('service') === 'azure';
}
public function getCredentials(Request $request)
{
return $this->fetchAccessToken($this->clientRegistry->getClient('azure'));
}
/**
* Récupère l'utilisateur à partir du AccessToken
*
* @param AccessToken $credentials
*/
public function getUser($credentials, UserProviderInterface $userProvider)
{
/** @var AzureResourceOwner $azureUser */
$azureUser = $this->clientRegistry->getClient('azure')->fetchUserFromToken($credentials);
return $this->userRepository->findFromAzureOauth($azureUser);
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
// RIEN ICI
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
{
$targetPath = $this->getTargetPath($request->getSession(), $providerKey);
return new RedirectResponse($targetPath ?: '/');
}
}