src/Security/FacebookAuthenticator.php line 20
<?phpnamespace App\Security;use App\Entity\User; // your user entityuse App\IlaveU\ShopBundle\Entity\Customer\Customer;use Doctrine\ORM\EntityManagerInterface;use KnpU\OAuth2ClientBundle\Client\ClientRegistry;use KnpU\OAuth2ClientBundle\Security\Authenticator\OAuth2Authenticator;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\RouterInterface;use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;use Symfony\Component\Security\Core\Exception\AuthenticationException;use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;use Symfony\Component\Security\Http\Authenticator\Passport\Passport;use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;class FacebookAuthenticator extends OAuth2Authenticator implementsAuthenticationEntrypointInterface{private $clientRegistry;private $entityManager;private $router;public function __construct(ClientRegistry $clientRegistry,EntityManagerInterface $entityManager,RouterInterface $router) {$this->clientRegistry = $clientRegistry;$this->entityManager = $entityManager;$this->router = $router;}public function supports(Request $request): ?bool{// continue ONLY if the current ROUTE matches the check ROUTEreturn $request->attributes->get('_route') === 'connect_facebook_check';}public function authenticate(Request $request): Passport{$client = $this->clientRegistry->getClient('facebook_main');$accessToken = $this->fetchAccessToken($client);return new SelfValidatingPassport(new UserBadge($accessToken->getToken(), function () use ($accessToken,$client) {/** @var FacebookUser $facebookUser */$facebookUser = $client->fetchUserFromToken($accessToken);$email = $facebookUser->getEmail();// 1) have they logged in with Facebook before? Easy!$existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['facebookId' => $facebookUser->getId()]);//User doesnt exist, we create it !if (!$existingUser) {if (!$email) {$emailDomain = 'example.com';$email = uniqid() . '@' . $emailDomain;}$existingUser = new User();$existingUser->setUsername($email);$existingUser->setPassword($facebookUser->getId());$existingUser->setRoles(["ROLE_CUSTOMER"]);$existingUser->setFacebookId($facebookUser->getId());//Customer}$existingCustomer = $this->entityManager->getRepository(Customer::class)->findOneBy(['user' => $existingUser]);if (!$existingCustomer or !$existingCustomer->getUser()) {$existingCustomer = new Customer();$existingCustomer->setEmail($email);$existingCustomer->setPhone('060000000000');$existingCustomer->setAddress('');}$existingCustomer->setFirstName($facebookUser->getFirstName());$existingCustomer->setLastName($facebookUser->getLastName());$existingCustomer->setUser($existingUser);$existingUser->setAvatar($facebookUser->getPictureUrl());$this->entityManager->persist($existingCustomer);$this->entityManager->persist($existingUser);$this->entityManager->flush();return $existingUser;}));}public function onAuthenticationSuccess(Request $request,TokenInterface $token,string $firewallName): ?Response {// change "app_homepage" to some route in your app$targetUrl = $this->router->generate('connect_facebook_after_connexion');return new RedirectResponse($targetUrl);// or, on success, let the request continue to be handled by the controller//return null;}public function onAuthenticationFailure(Request $request,AuthenticationException $exception): ?Response {$message = strtr($exception->getMessageKey(),$exception->getMessageData());return new Response($message, Response::HTTP_FORBIDDEN);}/*** Called when authentication is needed, but it's not sent.* This redirects to the 'login'.*/public function start(Request $request,AuthenticationException $authException = null): Response {return new RedirectResponse('/connect/', // might be the site, where users choose their oauth providerResponse::HTTP_TEMPORARY_REDIRECT);}}