<?php
namespace App\Security;
use App\Entity\User; // your user entity
use Doctrine\ORM\EntityManagerInterface;
use KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserProviderInterface;
class FacebookAuthenticator extends SocialAuthenticator
{
private $clientRegistry;
private $em;
private $router;
public function __construct(ClientRegistry $clientRegistry, EntityManagerInterface $em, RouterInterface $router, SessionInterface $session)
{
$this->clientRegistry = $clientRegistry;
$this->em = $em;
$this->router = $router;
$this->session = $session;
}
public function supports(Request $request)
{
return $request->attributes->get('_route') === 'connect_facebook_check';
}
public function getCredentials(Request $request)
{
return $this->fetchAccessToken($this->getOauthClient());
}
public function getUser($credentials, UserProviderInterface $userProvider)
{
$facebookUser = $this->getOauthClient()->fetchUserFromToken($credentials);
$email = $facebookUser->getEmail();
// 1) have they logged in before? Easy!
$existingUser = $this->em->getRepository(User::class)->findOneBy([
'email' => $facebookUser->getEmail()
]);
if ($existingUser) {
$existingUser->setUsername($facebookUser->getName());
$existingUser->setAvatar($facebookUser->getPictureUrl());
$existingUser->setFirstname($facebookUser->getFirstName());
$existingUser->setLastname($facebookUser->getLastName());
$existingUser->setEmailValidate(true);
$this->em->persist($existingUser);
$this->em->flush();
return $existingUser;
}
$user = new User();
$user->setPassword(uniqid());
$user->setUsername($facebookUser->getName());
$user->setEmail($facebookUser->getEmail());
$user->setAvatar($facebookUser->getPictureUrl());
$user->setActive(true);
$user->setEmailValidate(true);
$user->setFirstname($facebookUser->getFirstName());
$user->setLastname($facebookUser->getLastName());
$this->em->persist($user);
$this->em->flush();
return $user;
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
if ($exception->getMessage() == 'Invalid state') {
$this->session->getFlashBag()->add('warning', 'Token expiré.');
} else {
$this->session->getFlashBag()->add('danger', $exception->getMessage());
}
$response = new RedirectResponse($this->router->generate('login'));
return $response;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
$user = $token->getUser();
$response = new RedirectResponse($this->router->generate('home'));
return $response;
}
public function start(Request $request, AuthenticationException $authException = null)
{}
public function supportsRememberMe():bool
{
return true;
}
private function getOauthClient()
{
return $this->clientRegistry->getClient('facebook');
}
}
?>