src/Controller/AuthController.php line 52

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  8. use Microsoft\Graph\Graph;
  9. use Microsoft\Graph\Model;
  10. class AuthController extends AbstractController
  11. {
  12.     private $clientId;
  13.     private $clientSecret;
  14.     private $tenantId;
  15.     private $redirectUri;
  16.     // public function __construct()
  17.     public function __construct()
  18.     {
  19.         $this->clientId 'e7f8d124-a76c-4296-8695-f827391b2b77';
  20.         //$this->clientSecret = 'TGc8Q~Buu3CbivX4faPn0O53PFvqgrpOy9JykbvP';
  21.     $this->clientSecret 'G2H8Q~qrFG2B39H1sNfV4Z035Z3y-I7.fHdl7aU9';
  22.         $this->tenantId 'ef5de0ba-bf98-4bbd-b84f-8dea1c09508e';
  23.         $this->redirectUri 'https://firma.vilaviniteca.es/oauth/callback';
  24.     }
  25.     /**
  26.      * @Route("/login", name="login")
  27.      */
  28.     public function login(SessionInterface $session): Response
  29.     {
  30.         $state bin2hex(random_bytes(16));
  31.         $session->set('oauth_state'$state);
  32.         $url "https://login.microsoftonline.com/{$this->tenantId}/oauth2/v2.0/authorize?";
  33.         $url .= "client_id={$this->clientId}";
  34.         $url .= "&response_type=code";
  35.         $url .= "&redirect_uri=" urlencode($this->redirectUri);
  36.         $url .= "&response_mode=query";
  37.         $url .= "&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2F.default";
  38.         $url .= "&state={$state}";
  39.         return $this->redirect($url);
  40.     }
  41.     /**
  42.      * @Route("/oauth/callback", name="oauth_callback")
  43.      */
  44.     public function oauthCallback(Request $requestSessionInterface $session): Response
  45.     {
  46.         $state $request->query->get('state');
  47.         $storedState $session->get('oauth_state');
  48.         if ($state !== $storedState) {
  49.             // Error: el estado no coincide
  50.             return $this->redirectToRoute('app_error', ['message' => 'El estado no coincide. Posible ataque CSRF.']);
  51.         }
  52.         $code $request->query->get('code');
  53.         $accessToken $this->getAccessToken($code);
  54.         ##DEBUG
  55.         // echo "Este es el code:  <br>";
  56.         // var_dump($code);
  57.         // echo "<br>";
  58.         // echo "Este es el accessToken:  <br>";
  59.         // var_dump($accessToken);
  60.         // exit();
  61.         if ($accessToken) {
  62.             $userInfo $this->getUserInfo($accessToken);
  63.             // Aquí puedes almacenar el token de acceso en la sesión y realizar acciones adicionales si es necesario
  64.             $session->set('user_info'$userInfo);
  65.             $session->set('access_token'$accessToken);
  66.             // Redirigir al usuario a la ruta /generador
  67.             // echo " Redirigir al usuario a la ruta /generador";
  68.             // exit();
  69.             // return $this->redirectToRoute('generador');
  70.             return $this->redirectToRoute('app_generador_de_firmas');
  71.         } else {
  72.             // Error: no se pudo obtener el token de acceso
  73.             // echo "Error: no se pudo obtener el token de acceso";
  74.             // exit();
  75.             return $this->redirectToRoute('error', ['message' => 'No se pudo obtener el token de acceso.']);
  76.         }
  77.     }
  78.     private function getAccessToken($code)
  79.     {
  80.         $url "https://login.microsoftonline.com/{$this->tenantId}/oauth2/v2.0/token";
  81.         $params = [
  82.             'client_id' => $this->clientId,
  83.             'client_secret' => $this->clientSecret,
  84.             'grant_type' => 'authorization_code',
  85.             'code' => $code,
  86.             'redirect_uri' => $this->redirectUri,
  87.         ];
  88.         $ch curl_init();
  89.         curl_setopt($chCURLOPT_URL$url);
  90.         curl_setopt($chCURLOPT_POST1);
  91.         curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($params));
  92.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  93.         $response curl_exec($ch);
  94.         curl_close($ch);
  95.         $responseData json_decode($responsetrue);
  96.         if (isset($responseData['access_token'])) {
  97.             return $responseData['access_token'];
  98.         } else {
  99.             return null;
  100.         }
  101.     }
  102.     private function getUserInfo($accessToken)
  103.     {
  104.         $graph = new Graph();
  105.         $graph->setAccessToken($accessToken);
  106.         $user $graph->createRequest('GET''/me')
  107.             ->setReturnType(Model\User::class)
  108.             ->execute();
  109.         return $user;
  110.     }
  111.     /**
  112.      * @Route("/logout", name="logout")
  113.      */
  114.     public function logout(SessionInterface $session): Response
  115.     {
  116.         $session->remove('access_token');
  117.         $session->remove('user_info');
  118.         // var_dump($session->get('access_token'));
  119.         // exit();
  120.         return $this->redirectToRoute('app_home');
  121.     }
  122. }