src/Core/Controller/OAuthController.php line 112

Open in your IDE?
  1. <?php
  2. namespace App\Core\Controller;
  3. use App\Core\Entity\User;
  4. use App\Core\Repository\TutorialRepository;
  5. use App\Core\Repository\UserRepository;
  6. use App\Core\Security\LoginUserAuthenticator;
  7. use App\EventSubscriber\LocaleSubscriber;
  8. use App\EventSubscriber\UserLocaleSubscriber;
  9. use App\Service\TutorialService;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
  12. use KnpU\OAuth2ClientBundle\Client\Provider\GoogleClient;
  13. use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
  14. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpFoundation\Response;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  20. use KnpU\OAuth2ClientBundle\Exception\MissingAuthorizationCodeException;
  21. class OAuthController extends AbstractController
  22. {
  23. /**
  24. * @var TutorialRepository
  25. */
  26. private $tutorialRepository;
  27. /**
  28. * @var TutorialService
  29. */
  30. private $tutorialService;
  31. function __construct(TutorialRepository $tutorialRepository, TutorialService $tutorialService) {
  32. $this->tutorialRepository = $tutorialRepository;
  33. $this->tutorialService = $tutorialService;
  34. }
  35. #[Route('/login/google', name: 'app_verificar_login_google')]
  36. function googleVerficarLogin(ClientRegistry $clientRegistry) {
  37. return $clientRegistry->getClient('google')->redirect([],[]);
  38. }
  39. #[Route('/login/google/correcto', name: 'app_login_google')]
  40. function googleLogin(Request $request, ClientRegistry $clientRegistry, UserRepository $userRepository, EntityManagerInterface $entityManager, LoginUserAuthenticator $loginUserAuthenticator, GuardAuthenticatorHandler $guardAuthenticatorHandler) {
  41. /** @var GoogleClient $client */
  42. $client = $clientRegistry->getClient('google');
  43. try {
  44. $accessToken = $client->getAccessToken();
  45. /** @var \League\OAuth2\Client\Provider\GoogleUser $user */
  46. $user = $client->fetchUserFromToken($accessToken);
  47. $usuarioExistente = $userRepository->findOneBy(['email' => $user->getEmail()]);
  48. if ($usuarioExistente) {
  49. if (!$usuarioExistente->getGoogleId()) {
  50. $usuarioExistente->setGoogleId($user->getId());
  51. $entityManager->persist($usuarioExistente);
  52. }
  53. $request->request->set('usuarioExiste', true);
  54. }
  55. else {
  56. $usuarioExistente = new User();
  57. $usuarioExistente->setGoogleId($user->getId());
  58. $usuarioExistente->setEmail($user->getEmail());
  59. $usuarioExistente->setPrimerNombre($user->getFirstName());
  60. $usuarioExistente->setPrimerApellido($user->getLastName());
  61. $usuarioExistente->setUsername($user->getEmail());
  62. $usuarioExistente->asignarNombreCompleto();
  63. $usuarioExistente->setCreatedAt(new \DateTime());
  64. $localeDelNavegador = strtolower(str_split($_SERVER['HTTP_ACCEPT_LANGUAGE'], 2)[0]);
  65. if ($localeDelNavegador && trim($localeDelNavegador) !== '' && in_array($localeDelNavegador, UserLocaleSubscriber::getLenguajesDisponibles())) {
  66. $usuarioExistente->setIdioma($localeDelNavegador);
  67. }
  68. else {
  69. $usuarioExistente->setIdioma(LocaleSubscriber::$defaultLocale);
  70. }
  71. $entityManager->persist($usuarioExistente);
  72. //Agregarle todos los tutoriales al nuevo usuario
  73. $tutoriales = $this->tutorialRepository->findAll();
  74. foreach ($tutoriales as $tutorial) {
  75. $this->tutorialService->agregarTutorialAUsuario($usuarioExistente, $tutorial);
  76. }
  77. $request->request->set('usuarioExiste', false);
  78. }
  79. $entityManager->flush();
  80. return $guardAuthenticatorHandler->authenticateUserAndHandleSuccess(
  81. $usuarioExistente,
  82. $request,
  83. $loginUserAuthenticator,
  84. 'main'
  85. );
  86. } catch (IdentityProviderException $e) {
  87. return new Response($e->getMessage());
  88. }
  89. }
  90. #[Route('/login/facebook', name: 'app_verificar_login_facebook')]
  91. function facebookVerficarLogin(ClientRegistry $clientRegistry) {
  92. return $clientRegistry->getClient('facebook')->redirect([],[]);
  93. }
  94. #[Route('/login/facebook/correcto', name: 'app_login_facebook')]
  95. function facebookLogin(Request $request, ClientRegistry $clientRegistry, UserRepository $userRepository, EntityManagerInterface $entityManager, LoginUserAuthenticator $loginUserAuthenticator, GuardAuthenticatorHandler $guardAuthenticatorHandler) {
  96. /** @var \KnpU\OAuth2ClientBundle\Client\Provider\FacebookClient $client */
  97. $client = $clientRegistry->getClient('facebook');
  98. try {
  99. $accessToken = $client->getAccessToken();
  100. /** @var \League\OAuth2\Client\Provider\FacebookUser $user */
  101. $user = $client->fetchUserFromToken($accessToken);
  102. $usuarioExistente = $userRepository->findOneBy(['email' => $user->getEmail()]);
  103. if ($usuarioExistente) {
  104. if (!$usuarioExistente->getFacebookId()) {
  105. $usuarioExistente->setFacebookId($user->getId());
  106. $entityManager->persist($usuarioExistente);
  107. }
  108. $request->request->set('usuarioExiste', true);
  109. }
  110. else {
  111. $usuarioExistente = new User();
  112. $usuarioExistente->setFacebookId($user->getId());
  113. $usuarioExistente->setEmail($user->getEmail());
  114. $usuarioExistente->setPrimerNombre($user->getFirstName());
  115. $usuarioExistente->setPrimerApellido($user->getLastName());
  116. $usuarioExistente->setUsername($user->getEmail());
  117. $usuarioExistente->asignarNombreCompleto();
  118. $usuarioExistente->setCreatedAt(new \DateTime());
  119. $localeDelNavegador = strtolower(str_split($_SERVER['HTTP_ACCEPT_LANGUAGE'], 2)[0]);
  120. if ($localeDelNavegador && trim($localeDelNavegador) !== '' && in_array($localeDelNavegador, UserLocaleSubscriber::getLenguajesDisponibles())) {
  121. $usuarioExistente->setIdioma($localeDelNavegador);
  122. }
  123. else {
  124. $usuarioExistente->setIdioma(LocaleSubscriber::$defaultLocale);
  125. }
  126. $entityManager->persist($usuarioExistente);
  127. //Agregarle todos los tutoriales al nuevo usuario
  128. $tutoriales = $this->tutorialRepository->findAll();
  129. foreach ($tutoriales as $tutorial) {
  130. $this->tutorialService->agregarTutorialAUsuario($usuarioExistente, $tutorial);
  131. }
  132. $request->request->set('usuarioExiste', false);
  133. }
  134. $entityManager->flush();
  135. return $guardAuthenticatorHandler->authenticateUserAndHandleSuccess(
  136. $usuarioExistente,
  137. $request,
  138. $loginUserAuthenticator,
  139. 'main'
  140. );
  141. } catch (IdentityProviderException $e) {
  142. return new Response($e->getMessage());
  143. }
  144. catch (MissingAuthorizationCodeException $missingAuthorizationCodeException) {
  145. return $this->redirectToRoute('app_login', ['error' => 'Invalid Facebook token']);
  146. }
  147. }
  148. }