src/ApiBundle/OAuth/Extensions/FacebookGrantExtension.php line 53

Open in your IDE?
  1. <?php
  2. namespace ApiBundle\OAuth\Extensions;
  3. use ApiBundle\OAuth\FacebookSdk;
  4. use AppBundle\Entity\User;
  5. use AppBundle\Services\UserManager;
  6. use Facebook\Exceptions\FacebookResponseException;
  7. use Facebook\Exceptions\FacebookSDKException;
  8. use FOS\OAuthServerBundle\Storage\GrantExtensionInterface;
  9. use OAuth2\Model\IOAuth2Client;
  10. use OAuth2\OAuth2Exception;
  11. use Symfony\Bridge\Monolog\Logger;
  12. use Symfony\Component\DependencyInjection\ContainerInterface;
  13. use Symfony\Component\HttpFoundation\Response;
  14. class FacebookGrantExtension implements GrantExtensionInterface
  15. {
  16.     /**
  17.      * @var UserManager
  18.      */
  19.     protected $userManager null;
  20.     /**
  21.      * @var FacebookSdk
  22.      */
  23.     protected $facebookSdk null;
  24.     /**
  25.      * @var ContainerInterface
  26.      */
  27.     private $container;
  28.     /**
  29.      * @var Logger
  30.      */
  31.     private $logger;
  32.     /**
  33.      * FacebookGrantExtension constructor.
  34.      * @param UserManager $userManager
  35.      * @param FacebookSdk $facebookSdk
  36.      * @param ContainerInterface $container
  37.      */
  38.     public function __construct(
  39.         UserManager $userManager,
  40.         FacebookSdk $facebookSdk,
  41.         ContainerInterface $container
  42.     ) {
  43.         $this->userManager $userManager;
  44.         $this->facebookSdk $facebookSdk;
  45.         $this->container $container;
  46.         $this->logger $this->container->get('place.logger');
  47.     }
  48.     public function checkGrantExtension(IOAuth2Client $client, array $inputData, array $authHeaders)
  49.     {
  50.         if (!isset($inputData['facebook_token'])) {
  51.             throw new \OAuthException(
  52.                 Response::HTTP_BAD_REQUEST,
  53.                 'facebook_token param is empty'
  54.             );
  55.         }
  56.         try {
  57.             // Try to get the user with the facebook token from Open Graph
  58.             $facebookUser $this->facebookSdk->getFacebookUserByToken($inputData['facebook_token']);
  59.         } catch (FacebookResponseException $e) {
  60.             // When Graph returns an error
  61.             throw new \OAuthException(
  62.                 Response::HTTP_BAD_REQUEST,
  63.                 'Graph returned an error: '.$e->getMessage()
  64.             );
  65.         } catch (FacebookSDKException $e) {
  66.             // When validation fails or other local issues
  67.             throw new \OAuthException(
  68.                 Response::HTTP_BAD_REQUEST,
  69.                 'Facebook SDK returned an error: '.$e->getMessage()
  70.             );
  71.         }
  72.         if (empty($facebookUser) || empty($facebookUser->getId())) {
  73.             throw new \OAuthException(
  74.                 Response::HTTP_BAD_REQUEST,
  75.                 'facebook api did not returned user data'
  76.             );
  77.         }
  78.         /** @var User $user */
  79.         $user $this->userManager->findUserByFacebookId($facebookUser->getId());
  80.         // If no user found
  81.         if (null === $user) {
  82.             $this->logger->critical(self::class . ' - User is not found by facebook id' $facebookUser->getId());
  83.             return false;
  84.         }
  85.         return [
  86.             'data' => $user,
  87.         ];
  88.     }
  89. }