<?php
namespace App\Security;
use App\Entity\Fidelizacion\CategoriaCliente;
use App\Entity\Fidelizacion\CategoriaClientePersona;
use App\Entity\Fidelizacion\ParametrosFidelizacion;
use App\Entity\Persona\CargoRolPersona;
use App\Entity\Persona\CargosRol;
use App\Entity\Persona\Persona;
use App\Entity\Seguridades\Usuario;
use Doctrine\ORM\EntityManagerInterface;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator;
use League\OAuth2\Client\Provider\GoogleUser;
use Symfony\Component\HttpFoundation\{RedirectResponse, Request};
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class GoogleAuthenticator extends SocialAuthenticator
{
private $clientRegistry;
private $em;
private $router;
public function __construct(ClientRegistry $clientRegistry, EntityManagerInterface $em, RouterInterface $router)
{
$this->clientRegistry = $clientRegistry;
$this->em = $em;
$this->router = $router;
}
public function supports(Request $request)
{
return $request->getPathInfo() == '/connect/google/check' && $request->isMethod('GET');
}
public function getCredentials(Request $request)
{
return $this->fetchAccessToken($this->getGoogleClient());
}
public function getUser($credentials, UserProviderInterface $userProvider)
{
/** @var GoogleUser $googleUser */
$googleUser = $this->getGoogleClient()->fetchUserFromToken($credentials);
$email = $googleUser->getEmail();
//dump($googleUser);die();
$user = $this->em->getRepository(Usuario::class)->findOneBy(['usuario' => $email, 'usuarioGmail' => true]);
if (!$user) {
$newPersona = new Persona();
$newPersona = $this->setPersonaGmail($newPersona, $googleUser);
$this->em->persist($newPersona);
$newCargoRolPersona = new CargoRolPersona();
$newCargoRolPersona
->setIdCargosRol($this->em->getRepository(CargosRol::class)->find(3))
->setIdPersona($newPersona)
->setIdUsuarioModificacion(0)
->setFechaModificacion(new \DateTime())
->setIpModificacion($_SERVER['REMOTE_ADDR'])
;
$this->em->persist($newCargoRolPersona);
$categoriaClientePersona = new CategoriaClientePersona;
$parametroFidelizacionActivo = $this->em->getRepository(ParametrosFidelizacion::class)->findOneBy(['activo' => true]);
$categoriaClientePersona
->setFechaAsignacionCategoria(new \DateTime())
->setActivo(true)
->setIdCategoriaCliente($this->em->getRepository(CategoriaCliente::class)->findOneBy(['idParametrosFidelizacion' => $parametroFidelizacionActivo->getId(), 'nivel' => 1]))
->setIdPersona($newPersona)
->setIdUsuarioModificacion(0)
->setFechaModificacion(new \DateTime())
->setIpModificacion($_SERVER['REMOTE_ADDR'])
;
$this->em->persist($categoriaClientePersona);
$newUser = new Usuario();
$newUser = $this->setUsuarioGmail($newUser, $email);
$this->em->persist($newUser);
$this->em->flush();
return $newUser;
}
return $user;
}
private function setUsuarioGmail(Usuario $user, $email)
{
$user->setUsuario($email)
->setUsuarioGmail(true)
->setActivo(true)
->setBloqueado(false)
->setNuevaClave(false)
->setSuperAdmin(false)
->setIdUsuarioModificacion(0)
->setFechaModificacion(new \DateTime())
->setIpModificacion($_SERVER['REMOTE_ADDR']);
return $user;
}
private function setPersonaGmail(Persona $persona, $googleUser) {
$parametroFidelizacionActivo = $this->em->getRepository(ParametrosFidelizacion::class)->findOneBy(['activo' => true]);
$imagen = $this->generateAvatar($googleUser->getFirstName(), $googleUser->getLastName());
$persona
->setFoto($imagen)
->setApellidos($googleUser->getLastName())
->setNombres($googleUser->getFirstName())
->setMailPersonal($googleUser->getEmail())
->setIdCategoriaCliente($this->em->getRepository(CategoriaCliente::class)->findOneBy(['idParametrosFidelizacion' => $parametroFidelizacionActivo->getId(), 'nivel' => 1]))
->setIdUsuarioModificacion(0)
->setFechaModificacion(new \DateTime())
->setIpModificacion($_SERVER['REMOTE_ADDR']);
return $persona;
}
private function generateAvatar($nombres, $apellidos)
{
$name = substr($nombres, 0, 1) . ' ' . substr($apellidos, 0, 1);
$size = 512;
$bgColor = "EEEEEE";
$txtColor = "686868";
$url = "https://ui-avatars.com/api/?name=" . urlencode($name) . "&size={$size}&background={$bgColor}&color={$txtColor}";
$imageData = file_get_contents($url);
$base64 = base64_encode($imageData);
$imagen = "data:image/png;base64," . $base64;
return $imagen;
}
/**
* @return \knpU\OAuth2ClientBundle\Client\OAuth2Client
*/
private function getGoogleClient()
{
return $this->clientRegistry
->getClient('google');
}
/**
* @param Request $request The request that resulted in an AuthenticationException
* @param \Symfony\Component\Security\Core\Exception\AuthenticationException $authException The exception that started
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function start(Request $request, AuthenticationException $authException = null)
{
return new RedirectResponse('/');
}
/**
* @param Request $request
* @param AuthenticationException $exception
*
* @return \Symfony\Component\HttpFoundation\Response|null
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
return new RedirectResponse($this->router->generate('login'));
}
/**
* @param Request $request
* @param \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token
* @param string $providerKey The provider (i.e. firewall) key
*
* @return void
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
{
return new RedirectResponse($this->router->generate('mi_cancionero'));
}
}