src/Security/FacebookAuthenticator.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Kernel;
  4. use App\Entity\User// your user entity
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\RouterInterface;
  9. use League\OAuth2\Client\Provider\FacebookUser;
  10. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  13. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  14. use KnpU\OAuth2ClientBundle\Security\Authenticator\OAuth2Authenticator;
  15. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  17. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  18. class FacebookAuthenticator extends OAuth2Authenticator
  19. {
  20.     private $clientRegistry;
  21.     private $entityManager;
  22.     private $router;
  23.     private $kernel;
  24.     public function __construct(ClientRegistry $clientRegistryEntityManagerInterface $entityManagerRouterInterface $routerKernel $kernel)
  25.     {
  26.         $this->clientRegistry $clientRegistry;
  27.         $this->entityManager $entityManager;
  28.         $this->router $router;
  29.         $this->kernel $kernel;
  30.     }
  31.     public function supports(Request $request): ?bool
  32.     {
  33.         // continue ONLY if the current ROUTE matches the check ROUTE
  34.         return $request->attributes->get('_route') === 'connect_facebook_check';
  35.     }
  36.     public function authenticate(Request $request): Passport
  37.     {
  38.         $client $this->clientRegistry->getClient('facebook_main');
  39.         $accessToken $this->fetchAccessToken($client);
  40.         return new SelfValidatingPassport(
  41.             new UserBadge($accessToken->getToken(), function() use ($accessToken$client) {
  42.                 /** @var FacebookUser $facebookUser */
  43.                 $facebookUser $client->fetchUserFromToken($accessToken);
  44.                 $email $facebookUser->getEmail();
  45.                 $age round($facebookUser->getMinAge() + $facebookUser->getMaxAge()) / 2;
  46.                 // Если в базе нет пользователя с таким email, то сохраняем его
  47.                 /** @var User $user */
  48.                 $user $this->entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  49.                 
  50.                 if(!$user->getId()) {
  51.                     $user = new User();
  52.                 }
  53.                                 
  54.                 if ($facebookUser->getId() != $user->getFacebookId()) {
  55.                     $user->setFacebookId($facebookUser->getId());
  56.                 }
  57.                 
  58.                 if (!$user->getName()) {
  59.                     $user->setName($facebookUser->getFirstName());
  60.                 }
  61.                 if (!$user->getSurname()) {
  62.                     $user->setSurname($facebookUser->getLastName());
  63.                 }
  64.                 $this->entityManager->persist($user);
  65.                 $this->entityManager->flush();
  66.                 // Если в базе еще нет фото, а в фейсбук есть фото, то сохраняем его
  67.                 // $user_pic = $this->kernel->getProjectDir()."/public/pic/user/".$user->getId().".jpg";
  68.                 // if ($facebookUser->getPictureUrl() && !file_exists($user_pic)) {
  69.                 //     copy($facebookUser->getPictureUrl(), $user_pic);
  70.                 // }
  71.                 return $user;
  72.             })
  73.         );
  74.     }
  75.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  76.     {
  77.         $targetUrl $this->router->generate('user');
  78.         return new RedirectResponse($targetUrl);
  79.     }
  80.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  81.     {
  82.         $message strtr($exception->getMessageKey(), $exception->getMessageData());
  83.         return new Response($messageResponse::HTTP_FORBIDDEN);
  84.     }
  85. }