src/Security/FacebookAuthenticator.php line 28

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Manager\TokenManager;
  4. use App\Model\User\User;
  5. use App\Service\APIKiwi;
  6. use JMS\Serializer\DeserializationContext;
  7. use JMS\Serializer\SerializerInterface;
  8. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  9. use KnpU\OAuth2ClientBundle\Client\Provider\FacebookClient;
  10. use KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator;
  11. use League\OAuth2\Client\Provider\FacebookUser;
  12. use Symfony\Component\HttpFoundation\RedirectResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. use Symfony\Component\Routing\RouterInterface;
  17. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  18. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  19. use Symfony\Component\Security\Core\Security;
  20. use Symfony\Component\Security\Core\User\UserProviderInterface;
  21. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  22. /**
  23.  * Class FacebookAuthenticator
  24.  * @package App\Security
  25.  */
  26. class FacebookAuthenticator extends SocialAuthenticator
  27. {
  28.     use TargetPathTrait;
  29.     /**
  30.      * @var UrlGeneratorInterface $urlGenerator
  31.      */
  32.     private UrlGeneratorInterface $urlGenerator;
  33.     /**
  34.      * @var APIKiwi $APIKiwi
  35.      */
  36.     private APIKiwi $APIKiwi;
  37.     /**
  38.      * @var RouterInterface $router
  39.      */
  40.     private RouterInterface $router;
  41.     /**
  42.      * @var ClientRegistry  $clientRegistry
  43.      */
  44.     private ClientRegistry $clientRegistry;
  45.     /**
  46.      * @var RequestStack $requestStack
  47.      */
  48.     private RequestStack $requestStack;
  49.     /**
  50.      * @var SerializerInterface $serializer
  51.      */
  52.     private SerializerInterface $serializer;
  53.     /**
  54.      * @var TokenManager
  55.      */
  56.     private TokenManager $tokenManager;
  57.     /**
  58.      * FacebookAuthenticator constructor.
  59.      * @param RouterInterface $router
  60.      * @param ClientRegistry $clientRegistry
  61.      * @param APIKiwi $APIKiwi
  62.      * @param RequestStack $requestStack
  63.      * @param SerializerInterface $serializer
  64.      * @param TokenManager $tokenManager
  65.      */
  66.     public function __construct(RouterInterface $routerClientRegistry $clientRegistryAPIKiwi $APIKiwi,
  67.                                 RequestStack $requestStackSerializerInterface $serializer,
  68.                                 UrlGeneratorInterface $urlGeneratorTokenManager $tokenManager)
  69.     {
  70.         $this->router $router;
  71.         $this->clientRegistry $clientRegistry;
  72.         $this->APIKiwi $APIKiwi;
  73.         $this->requestStack $requestStack;
  74.         $this->serializer $serializer;
  75.         $this->urlGenerator $urlGenerator;
  76.         $this->tokenManager $tokenManager;
  77.     }
  78.     /**
  79.      * @inheritDoc
  80.      */
  81.     public function start(Request $requestAuthenticationException $authException null)
  82.     {
  83.         return new RedirectResponse($this->router->generate('app_login'));
  84.     }
  85.     /**
  86.      * @inheritDoc
  87.      */
  88.     public function supports(Request $request): bool
  89.     {
  90.         return 'oauth_check_facebook' === $request->attributes->get('_route') && $request->get('service') === 'facebook';
  91.     }
  92.     /**
  93.      * @inheritDoc
  94.      */
  95.     public function getCredentials(Request $request)
  96.     {
  97.         return $this->fetchAccessToken($this->getClient());
  98.     }
  99.     /**
  100.      * @inheritDoc
  101.      * @throws \Exception
  102.      */
  103.     public function getUser($credentialsUserProviderInterface $userProvider): ?User
  104.     {
  105.         /** @var FacebookUser $facebookUser */
  106.         $facebookUser $this->getClient()
  107.             ->fetchUserFromToken($credentials);
  108.         $email str_replace('%40''@'$facebookUser->getEmail());
  109.         try{
  110.             $response $this->APIKiwi->postPublicKiwi(['path' =>'/public/users/facebook_check''data' =>['email' => $email]]);
  111.             $apiToken $this->tokenManager->decodeContent($response)['token'];
  112.             $content $this->tokenManager->decodeIgnoreExpired($apiToken);
  113.         }catch (\Exception $exception)
  114.         {
  115.             $this->requestStack->getSession()->set('kiwi_facebook_user'$this->serializer->serialize($facebookUser'json'));
  116.             return null;
  117.         }
  118.         $response $this->APIKiwi->getKiwi(['path' => '/users/'.$content['user_uuid'], 'token' => $apiToken]);
  119.         $user $this->serializer->deserialize(
  120.             $response->getContent(),
  121.             User::class,
  122.             'json',
  123.             DeserializationContext::create()->setGroups(['get_user'])
  124.         );
  125.         $user->setToken($apiToken);
  126.         //if empty there is a problem
  127.         if( !$user->getId() || !$user->getEmail() ) {
  128.             return null;
  129.         }
  130.         return $user;
  131.     }
  132.     /**
  133.      * @inheritDoc
  134.      */
  135.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): RedirectResponse
  136.     {
  137.         if ($request->hasSession()) {
  138.             $request->getSession()->set(Security::AUTHENTICATION_ERROR$exception);
  139.         }
  140.         return new RedirectResponse($this->router->generate('kiwi_register_user'));
  141.     }
  142.     /**
  143.      * @inheritDoc
  144.      */
  145.     public function onAuthenticationSuccess(Request $requestTokenInterface $token$providerKey): ?RedirectResponse
  146.     {
  147.         return new RedirectResponse($this->urlGenerator->generate('kiwi_homepage'));
  148.     }
  149.     /**
  150.      * @return FacebookClient
  151.      */
  152.     private function getClient (): FacebookClient {
  153.         return $this->clientRegistry->getClient('facebook');
  154.     }
  155. }