src/Controller/FrontPageController.php line 41

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\FsbRequest;
  4. use App\Entity\User;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Routing\Annotation\Route;
  9. use Knp\Component\Pager\PaginatorInterface;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. // for Testing:
  12. use Firebase\JWT\JWK;
  13. use Firebase\JWT\JWT;
  14. class FrontPageController extends AbstractController
  15. {
  16.     private $entityManager;
  17.     /**
  18.      * Undocumented variable
  19.      *
  20.      * @var PaginatorInterface
  21.      */
  22.     private PaginatorInterface $paginator;
  23.     /**
  24.      * Undocumented function
  25.      *
  26.      * @param EntityManagerInterface $twig
  27.      * @param PaginatorInterface $paginator
  28.      */
  29.     public function __construct(EntityManagerInterface $entityManagerPaginatorInterface $paginator)
  30.     {
  31.         $this->entityManager $entityManager;
  32.         $this->paginator $paginator;
  33.     }
  34.     #[Route('/'name'home')]
  35.     public function index(): Response
  36.     {
  37.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  38.         $user $this->getUser();
  39.         $fsbRequestRepository $this->entityManager->getRepository(FsbRequest::class);
  40.         $qb $fsbRequestRepository->getQueryByUser($user);
  41.         $results $this->paginator->paginate(
  42.             $qb,
  43.             1,
  44.             3,
  45.             [
  46.                 'defaultSortFieldName'      => 'mine.updatedAt',
  47.                 'defaultSortDirection' => 'desc'
  48.             ]
  49.         );
  50.         return $this->render('front_page/index.html.twig', [
  51.             'controller_name' => 'FrontPageController',
  52.             'fsb_requests' => $results,
  53.         ]);
  54.     }
  55.     #[Route('/nutzen'name'nutzen')]
  56.     public function nutzen(): Response
  57.     {
  58.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  59.         $user $this->getUser();
  60.         $fsbRequestRepository $this->entityManager->getRepository(FsbRequest::class);
  61.         $qb $fsbRequestRepository->getQueryByUser($user);
  62.         $results $this->paginator->paginate(
  63.             $qb,
  64.             1,
  65.             3,
  66.             [
  67.                 'defaultSortFieldName'      => 'mine.updatedAt',
  68.                 'defaultSortDirection' => 'desc'
  69.             ]
  70.         );
  71.         return $this->render('front_page/index.html.twig', [
  72.             'controller_name' => 'FrontPageController',
  73.             'fsb_requests' => $results,
  74.         ]);
  75.     }
  76.     #[Route('/daten'name'daten')]
  77.     public function daten(): Response
  78.     {
  79.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  80.         $user $this->getUser();
  81.         $fsbRequestRepository $this->entityManager->getRepository(FsbRequest::class);
  82.         $qb $fsbRequestRepository->getQueryByUser($user);
  83.         $results $this->paginator->paginate(
  84.             $qb,
  85.             1,
  86.             3,
  87.             [
  88.                 'defaultSortFieldName'      => 'mine.updatedAt',
  89.                 'defaultSortDirection' => 'desc'
  90.             ]
  91.         );
  92.         return $this->render('front_page/index.html.twig', [
  93.             'controller_name' => 'FrontPageController',
  94.             'fsb_requests' => $results,
  95.         ]);
  96.     }
  97.     #[Route('/api2/test'name'app_api_test')]
  98.     public function apiTest()
  99.     {
  100.         /** @var User $user */
  101.         $user $this->getUser();
  102.         return $this->json([
  103.             'message' => 'You successfully authenticated!',
  104.             'email' => $user->getEmail(),
  105.         ]);
  106.     }
  107.     #[Route('.well-known/jwks.json'name'app_jwks'methods: ['GET'])]
  108.     public function jwks(): Response
  109.     {
  110.         // Load the public key from the filesystem and use OpenSSL to parse it.
  111.         $kernelDirectory $this->getParameter('kernel.project_dir');
  112.         $publicKey openssl_pkey_get_public(file_get_contents($kernelDirectory '/var/keys/public.key'));
  113.         $details openssl_pkey_get_details($publicKey);
  114.         $jwks = [
  115.             'keys' => [
  116.                 [
  117.                     'kty' => 'RSA',
  118.                     'alg' => 'RS256',
  119.                     'use' => 'sig',
  120.                     'kid' => '1',
  121.                     'n' => strtr(rtrim(base64_encode($details['rsa']['n']), '='), '+/''-_'),
  122.                     'e' => strtr(rtrim(base64_encode($details['rsa']['e']), '='), '+/''-_'),
  123.                 ],
  124.             ],
  125.         ];
  126.         return $this->json($jwks);
  127.     }
  128. // For Testing:
  129.     private string $clientId '89ae85bfc478886f1419fsbstuckmann';
  130.     private string $clientSecret 'a9189f952dd25f51ba4a0f33e50f0a69968480dd331bdb843be41bfe0c75069b';
  131.     private string $redirectUri 'https://fsb.in-properties.de/client/callback';
  132.     private string $authServer 'https://fsb.in-properties.de/authorize';
  133.     private string $tokenServer 'https://fsb.in-properties.de/token';
  134.     private string $jwksUri 'https://fsb.in-properties.de/.well-known/jwks.json';
  135.     private string $apiUri 'https://fsb.in-properties.de/api';
  136.     #[Route('client'name'app_clienthome'methods: ['GET'])]
  137.     public function clienthome(Request $request)
  138.     {
  139.         $content 'ha...<br>';
  140.         $accessToken $request->query->get('access_token');
  141.         if (null !== $accessToken) {
  142.             $content .= '<p><a href="client/api?access_token='.$accessToken.'">Call API</a></p><p><a href="client/logout">Logout</a></p>';
  143.         } else {
  144.             $content .= '<p><a href="client/login">login</a></p><p><a href="client/logout">Logout</a></p>';
  145.         }
  146.         $response = new Response();
  147.         $response->headers->set('Content-Type''text/html');
  148.         $response->setContent('<html><body>'.$content.'</body></html>');
  149.         $response->setStatusCode(Response::HTTP_OK);
  150.         return $response;
  151.     }
  152.     #[Route('client/login'name'app_client_login'methods: ['GET'])]
  153.     public function clientlogin(Request $request)
  154.     {
  155.         // Redirect to the authorization server.
  156.         $params = [
  157.           'response_type' => 'code',
  158.           'client_id' => $this->clientId,
  159.           'client_secret' => $this->clientSecret,
  160.           'redirect_uri' => $this->redirectUri,
  161.           'scope' => 'profile email',
  162.         ];
  163.         $url $this->authServer '?' http_build_query($params);
  164.         return $this->redirect($url);
  165.     }
  166.     #[Route('client/callback'name'app_client_callback'methods: ['GET'])]
  167.     public function clientCallback(Request $request)
  168.     {
  169.         $code $request->query->get('code') ?? null;
  170.         if (null === $code) {
  171.             $content 'No code provided<br>';
  172.             if (null !== $request->query->get('error_description')) {
  173.                 $content .= 'Error: ' $request->query->get('error_description') . '<br>';
  174.             }
  175.             $content .= '<a href="/client">Back</a>';
  176.             $response = new Response();
  177.             $response->headers->set('Content-Type''text/html');
  178.             $response->setContent('<html><body>'.$content.'</body></html>');
  179.             $response->setStatusCode(Response::HTTP_OK);
  180.             return $response;
  181.         }
  182.         // Swap the code for an access token.
  183.         $params = [
  184.             'grant_type' => 'authorization_code',
  185.             'client_id' => $this->clientId,
  186.             'client_secret' => $this->clientSecret,
  187.             'redirect_uri' => $this->redirectUri,
  188.             'code' => $code,
  189.         ];
  190.         $ch curl_init($this->tokenServer);
  191.         curl_setopt($chCURLOPT_POSTtrue);
  192.         curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($params));
  193.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  194.         // Ignore SSL for demo purposes.
  195.         curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
  196.         curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
  197.         $response curl_exec($ch);
  198.         $response json_decode($responsetrue);
  199.         $accessToken $response['access_token'] ?? null;
  200.         $content '';
  201.         if (!$accessToken) {
  202.             $content 'No access token provided<br>';
  203.             if (isset($response['hint'])) {
  204.                 $content .= 'Error: ' $response['hint'] . '<br>';
  205.             }
  206.             $content .= '<a href="/">Back</a>';
  207.             $response2 = new Response();
  208.             $response2->headers->set('Content-Type''text/html');
  209.             $response2->setContent('<html><body>'.$content.'</body></html>');
  210.             $response2->setStatusCode(Response::HTTP_OK);
  211.             return $response2;
  212.         }
  213.         try {
  214.             $streamContext stream_context_create([
  215.                 'ssl' => [
  216.                     'verify_peer' => false,
  217.                     'verify_peer_name' => false,
  218.                 ],
  219.             ]);
  220.             $jwks JWK::parseKeySet(json_decode(file_get_contents($this->jwksUricontext$streamContext), true));
  221.             var_dump('Wie heißt das erste Element:'$jwks);
  222.             $jwttoken $jwks[1];
  223.             JWT::$leeway 10;
  224.             JWT::decode($accessToken$jwks[1]);
  225.         } catch (\Exception $e) {
  226.             $content 'Error decoding JWT: ' $e->getMessage();
  227.             $response2 = new Response();
  228.             $response2->headers->set('Content-Type''text/html');
  229.             $response2->setContent('<html><body>'.$content.'</body></html>');
  230.             $response2->setStatusCode(Response::HTTP_OK);
  231.             return $response2;
  232.         }
  233.         // Save the access token in a cookie.
  234.         //$session = $this->requestStack->getSession();
  235.           // stores an attribute in the session for later reuse
  236.           //$session->set('accesstoken', $accessToken);
  237.         //$request->cookies->set('access_token', $accessToken, time() + 3600);
  238.         // Redirect to the home page.
  239.         return $this->redirect('/client?access_token='.$accessToken);
  240.     }
  241.     #[Route('client/api'name'app_client_api'methods: ['GET'])]
  242.     public function clientApi(Request $request)
  243.     {
  244.         // Get the access token from the cookie.
  245.         $accessToken $request->query->get('access_token') ?? null;
  246.         if (null === $accessToken) {
  247.             $content 'No access token provided.<br/><a href="/">Back</a>';
  248.             $response2 = new Response();
  249.             $response2->headers->set('Content-Type''text/html');
  250.             $response2->setContent('<html><body>'.$content.'</body></html>');
  251.             $response2->setStatusCode(Response::HTTP_OK);
  252.             return $response2;
  253.         }
  254.         // Call the API.
  255.         $ch curl_init($this->apiUri);
  256.         curl_setopt($chCURLOPT_HTTPHEADER, [
  257.             'Authorization: Bearer ' $accessToken,
  258.         ]);
  259.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  260.         // Ignore SSL for demo purposes.
  261.         curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
  262.         curl_setopt($chCURLOPT_SSL_VERIFYHOSTfalse);
  263.         $response curl_exec($ch);
  264.         $response json_decode($responsetrue);
  265.         $content '<p>Calling API on ' $this->apiUri '<br>';
  266.         $content .= 'With access token ' $accessToken '</p>';
  267.         $content .= 'Response: <div class="w3-code"><pre>' print_r($responsetrue) . '</pre></div><br>';
  268.         $content .= '<a href="/client">Back</a>';
  269.         $response2 = new Response();
  270.         $response2->headers->set('Content-Type''text/html');
  271.         $response2->setContent('<html><body>'.$content.'</body></html>');
  272.         $response2->setStatusCode(Response::HTTP_OK);
  273.         return $response2;
  274.     }
  275.     #[Route('client/logout'name'app_client_logout'methods: ['GET'])]
  276.     public function clientLogout(Request $request)
  277.     {
  278.         $request->cookies->set('access_token'''time() - 3600);
  279.         return $this->redirect('/client');
  280.     }
  281. }