src/Security/LoginAuthenticator.php line 47

Open in your IDE?
  1. <?php
  2. // src/Security/LoginFormAuthenticator.php
  3. namespace App\Security;
  4. use App\Entity\ApiToken;
  5. use App\Entity\Log;
  6. use App\Entity\User;
  7. use App\Document\Entities;
  8. use DateTime;
  9. use Doctrine\ODM\MongoDB\DocumentManager;
  10. use Doctrine\ORM\EntityManager;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\Routing\RouterInterface;
  16. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  17. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  18. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  19. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  20. use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
  21. use Symfony\Component\Security\Core\Security;
  22. use Symfony\Component\Security\Core\User\UserInterface;
  23. use Symfony\Component\Security\Core\User\UserProviderInterface;
  24. use Symfony\Component\Security\Csrf\CsrfToken;
  25. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  26. use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
  27. use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
  28. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  29. use Symfony\Component\HttpFoundation\Response;
  30. class LoginAuthenticator extends AbstractGuardAuthenticator
  31. {
  32.     use TargetPathTrait;
  33.     private $entityManager;
  34.     private $router;
  35.     private $csrfTokenManager;
  36.     private $passwordEncoder;
  37.     public function __construct(DocumentManager $dm,EntityManagerInterface $entityManagerRouterInterface $routerCsrfTokenManagerInterface $csrfTokenManagerUserPasswordEncoderInterface $passwordEncoder)
  38.     {
  39.         $this->entityManager $entityManager;
  40.         $this->router $router;
  41.         $this->csrfTokenManager $csrfTokenManager;
  42.         $this->passwordEncoder $passwordEncoder;
  43.         $this->dm=$dm;
  44.     }
  45.     public function supports(Request $request)
  46.     {
  47.         return 'account_login' === $request->attributes->get('_route')
  48.             && $request->isMethod('POST');
  49.     }
  50.     public function getCredentials(Request $request)
  51.     {
  52.         if ($request->request->get('type') == 'facebook') {
  53.             $credentials = [
  54.                 'type' => $request->request->get('type'),
  55.                 'idUser' => $request->request->get('idUser'),
  56.                 'accessToken' => $request->request->get('tokenFacebook'),
  57.             ];
  58.         }
  59.         elseif($request->request->get('type')=='google'){
  60.             $credentials = [
  61.                 'accessToken' => $request->request->get('accessToken'),
  62.                 'idUser' => $request->request->get('idUser'),
  63.                 'type' => $request->request->get('type'),
  64.             ];
  65.         }
  66.         else {
  67.             $credentials = [
  68.                 'email' => $request->request->get('email'),
  69.                 'password' => $request->request->get('password'),
  70.                 'role' => $request->request->get('role')
  71.             ];
  72.         }
  73.         return $credentials;
  74.     }
  75.     public function getUser($credentialsUserProviderInterface $userProvider)
  76.     {
  77.         if (array_key_exists("type"$credentials) && $credentials['type'] == 'facebook') {
  78.             $user $this->entityManager->getRepository(User::class)->findOneBy(['facebook_id' => $credentials['idUser']]);
  79.         }
  80.         
  81.         elseif(array_key_exists("type"$credentials) && $credentials['type'] == 'google')
  82.         {
  83.             $user $this->entityManager->getRepository(User::class)->findOneBy(['google_id' => $credentials['idUser']]);
  84.         }
  85.         else {
  86.             $user $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['email']]);
  87.         }
  88.         if (!$user) {
  89.             throw new CustomUserMessageAuthenticationException('Login incorrecte');
  90.         } else if ($user->getIsActive() == false) {
  91.             throw new CustomUserMessageAuthenticationException('compte innactive');
  92.         } else if ($user->getIsBlocked() == true) {
  93.             throw new CustomUserMessageAuthenticationException('compte supprimé');
  94.         }
  95.         return $user;
  96.     }
  97.     public function checkCredentials($credentialsUserInterface $user)
  98.     {
  99.         if (array_key_exists("type"$credentials) && $credentials['type'] == 'facebook') {
  100.             return $this->facebook_check($credentials);
  101.         }
  102.         elseif(array_key_exists("type"$credentials) && $credentials['type'] == 'google')
  103.        {
  104.         return $this->google_check($credentials);
  105.        }
  106.        else{
  107.         $hasRole=$this->checkRole($credentials['email'],$credentials['role']);
  108.         if($hasRole)
  109.         {
  110.             return $this->passwordEncoder->isPasswordValid($user$credentials['password']);
  111.         }
  112.         else{
  113.             return false;
  114.         }
  115.        
  116.        }
  117.      
  118.     }
  119.     public function checkRole($email,$role)
  120.     {
  121.         $user $this->entityManager->getRepository(User::class)->findOneBy(['email' => $email]);
  122.         if($user)
  123.         {
  124.             if (in_array($role$user->getRoles())) {
  125.                 return true;
  126.             }
  127.             else{
  128.                 return false;
  129.             }
  130.         }
  131.         else{
  132.             return false;
  133.         }
  134.     }
  135.     public function facebook_check($credentials)
  136.     {
  137.         $token $credentials['tokenFacebook'];
  138.         // Get the token's FB app info.
  139.         $tokenAppResp file_get_contents('https://graph.facebook.com/app/?access_token=' $token);
  140.         //   var_dump($tokenAppResp);
  141.         if (!$tokenAppResp) {
  142.             return false;
  143.         }
  144.         // Make sure it's the correct app.
  145.         $tokenApp json_decode($tokenAppResptrue);
  146.         if (!$tokenApp || !isset($tokenApp['id']) || $tokenApp['id'] != 654143709352565) {
  147.             return false;
  148.         }
  149.         // Get the token's FB user info.
  150.         $tokenUserResp file_get_contents('https://graph.facebook.com/me/?access_token=' $token);
  151.         // var_dump($tokenUserResp);
  152.         if (!$tokenUserResp) {
  153.             return false;
  154.         }
  155.         // Try to fetch user by it's token ID, create it otherwise.
  156.         $tokenUser json_decode($tokenUserResptrue);
  157.         if (!$tokenUser || !isset($tokenUser['id'])) {
  158.             return false;
  159.         }
  160.         if ($tokenUser['id'] == $credentials['idUser']) {
  161.             return true;
  162.         } else {
  163.             return false;
  164.         }
  165.     }
  166.     public function google_check($credentials)
  167.     {
  168.         $token $credentials['accessToken'];
  169.         // Get the token's FB app info.
  170.        
  171.         // Get the token's FB user info.
  172.         $tokenUserResp file_get_contents('https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=' $token);
  173.         // var_dump($tokenUserResp);
  174.         if (!$tokenUserResp) {
  175.             return false;
  176.         }
  177.         // Try to fetch user by it's token ID, create it otherwise.
  178.         $tokenUser json_decode($tokenUserResptrue);
  179.         if (!$tokenUser || !isset($tokenUser['sub'])) {
  180.             return false;
  181.         }
  182.         if ($tokenUser['sub'] == $credentials['idUser']) {
  183.             return true;
  184.         } else {
  185.             return false;
  186.         }
  187.     }
  188.     public function onAuthenticationSuccess(Request $requestTokenInterface $token$providerKey)
  189.     {
  190.         $auth_user $token->getUser();
  191.         $apiT = new ApiToken($auth_user);
  192.         # if($request->has('device_token')){
  193. //        $apiT->setDeviceTokken($request->get('device_token'));
  194.         #}
  195.         $this->entityManager->persist($apiT);
  196.         $this->entityManager->flush();
  197.         $acountMongo $this->dm->getRepository(Entities::class)->find($auth_user->getUserIdentifier());
  198.         $checkAdresseLivraison=false;
  199.         if($acountMongo)
  200.         {
  201.             if($acountMongo)
  202.             {
  203.                 if($acountMongo->getExtraPayload()['timeLivraison']==""||$acountMongo->getExtraPayload()['tempsLivraison'])
  204.                 {
  205.                     $comptes $this->dm->createQueryBuilder(Entities::class)
  206.                     ->field('name')->equals('comptes')
  207.                     ->field('extraPayload.Identifiant')->equals($auth_user->getUserIdentifier())
  208.                     ->findAndUpdate()
  209.                     ->field('extraPayload.timeLivraison')->set("Now")
  210.                     ->field('extraPayload.tempsLivraison')->set("Midi")
  211.                     ->getQuery()
  212.                     ->execute();
  213.                 }
  214.                 $adresseLivraison $this->dm->createQueryBuilder(Entities::class)
  215.                 ->field('name')->equals('adresseLivraison')
  216.                 ->field('extraPayload.linkedCompte')->equals($auth_user->getUserIdentifier())
  217.                 ->getQuery()
  218.                 ->getSingleResult();
  219.                 if($adresseLivraison)
  220.                 {
  221.                     $checkAdresseLivraison=true;
  222.                 }
  223.             }
  224.         }
  225.         return new JsonResponse(['checkAdresseLivraison'=>$checkAdresseLivraison,'token' => $apiT->getToken(),'identifiantMongo'=>$auth_user->getUserIdentifier(), 'role' => $auth_user->getRoles(), 'message' => 'login success'200, [], true]);
  226.     }
  227.     // on failure, that authenticator class is calling getLoginUrl() and trying to redirect there. 
  228.     protected function getLoginUrl()
  229.     {
  230.         return $this->router->generate('account_login');
  231.     }
  232.     public function start(Request $requestAuthenticationException $authException null)
  233.     {
  234.         // TODO: Implement start() method.
  235.         return new Response('must been authenticated');
  236.     }
  237.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception)
  238.     {
  239.         return new JsonResponse([
  240.             'message' => $exception->getMessageKey()
  241.         ], 401);
  242.     }
  243.     public function supportsRememberMe()
  244.     {
  245.         // TODO: Implement supportsRememberMe() method.
  246.     }
  247. }