src/Security/FacebookAuthenticator.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Entity\User; // your user entity
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator;
  6. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  11. use Symfony\Component\Routing\RouterInterface;
  12. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  13. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  14. use Symfony\Component\Security\Core\User\UserProviderInterface;
  15. class FacebookAuthenticator extends SocialAuthenticator
  16. {
  17.     private $clientRegistry;
  18.     private $em;
  19.     private $router;
  20.     public function __construct(ClientRegistry $clientRegistry, EntityManagerInterface $em, RouterInterface $router, SessionInterface $session)
  21.     {
  22.         $this->clientRegistry = $clientRegistry;
  23.         $this->em = $em;
  24.         $this->router = $router;
  25.         $this->session = $session;
  26.     }
  27.     public function supports(Request $request)
  28.     {
  29.         return $request->attributes->get('_route') === 'connect_facebook_check';
  30.     }
  31.     public function getCredentials(Request $request)
  32.     {
  33.         return $this->fetchAccessToken($this->getOauthClient());
  34.     }
  35.     public function getUser($credentials, UserProviderInterface $userProvider)
  36.     {
  37.         $facebookUser = $this->getOauthClient()->fetchUserFromToken($credentials);
  38.         $email = $facebookUser->getEmail();
  39.         // 1) have they logged in before? Easy!
  40.         $existingUser = $this->em->getRepository(User::class)->findOneBy([
  41.             'email' => $facebookUser->getEmail()
  42.         ]);
  43.         if ($existingUser) {
  44.             $existingUser->setUsername($facebookUser->getName());
  45.             $existingUser->setAvatar($facebookUser->getPictureUrl());
  46.             $existingUser->setFirstname($facebookUser->getFirstName());
  47.             $existingUser->setLastname($facebookUser->getLastName());
  48.             $existingUser->setEmailValidate(true);
  49.             $this->em->persist($existingUser);
  50.             $this->em->flush();
  51.             return $existingUser;
  52.         }
  53.         $user = new User();
  54.         $user->setPassword(uniqid());
  55.         $user->setUsername($facebookUser->getName());
  56.         $user->setEmail($facebookUser->getEmail());
  57.         $user->setAvatar($facebookUser->getPictureUrl());
  58.         $user->setActive(true);
  59.         $user->setEmailValidate(true);
  60.         $user->setFirstname($facebookUser->getFirstName());
  61.         $user->setLastname($facebookUser->getLastName());
  62.         $this->em->persist($user);
  63.         $this->em->flush();
  64.         return $user;
  65.     }
  66.     public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
  67.     {
  68.         if ($exception->getMessage() == 'Invalid state') {
  69.             $this->session->getFlashBag()->add('warning', 'Token expiré.');
  70.         } else {
  71.             $this->session->getFlashBag()->add('danger', $exception->getMessage());
  72.         }
  73.         $response = new RedirectResponse($this->router->generate('login'));
  74.         return $response;
  75.     }
  76.     public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
  77.     {
  78.         $user = $token->getUser();
  79.         
  80.         $response = new RedirectResponse($this->router->generate('home'));
  81.         
  82.         return $response;
  83.     }
  84.     public function start(Request $request, AuthenticationException $authException = null)
  85.     {}
  86.     public function supportsRememberMe():bool
  87.     {
  88.         return true;
  89.     }
  90.     private function getOauthClient()
  91.     {
  92.         return $this->clientRegistry->getClient('facebook');
  93.     }
  94. }
  95. ?>