apiservice = $apiservice; $this->passwordencoder = $passwordencoder; $this->ldapservice = $ldapservice; } public function loginsql(Request $request): Response { $challenge = $request->query->get('login_challenge'); // S'il n'y a pas de challenge, on déclenche une bad request if (!$challenge) { throw new BadRequestException('pas de challenge'); } // On vérifie que la requête d'identification provient bien de hydra $response = $this->apiservice->run('GET', $this->getParameter('hydraLoginchallenge').$challenge, null); if (!$response) { throw new BadRequestException('challenge invalide'); } // si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect $request->getSession()->set('hydraChallenge', $challenge); // Création du formulaire $form = $this->createForm(LoginType::class); // Récupération des data du formulaire $form->handleRequest($request); // Affichage du formulaire return $this->render('Home/loginHYDRA.html.twig', [ 'useheader' => false, 'usemenu' => false, 'usesidebar' => false, 'form' => $form->createView(), 'mode' => 'SQL', ]); } public function checkloginsql(Request $request, ManagerRegistry $em) { $username = $request->get('login')['username']; $password = $request->get('login')['password']; // user exist ? $user = $em->getRepository("App\Entity\User")->findOneBy(['username' => $username]); if (!$user) { return $this->redirect($this->generateUrl('app_hydra_loginsql', ['login_challenge' => $request->getSession()->get('hydraChallenge')])); } $islogin = $this->passwordencoder->verify($user->getPassword(), $password, $user->getSalt()); if (!$islogin) { return $this->redirect($this->generateUrl('app_hydra_loginsql', ['login_challenge' => $request->getSession()->get('hydraChallenge')])); } $response = $this->apiservice->run('PUT', $this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'), ['subject' => $user->getEmail(), 'acr' => 'string']); if (!$response || '200' != $response->code) { throw new BadRequestException('login accept invalide'); } $datas = [ 'username' => $user->getUsername(), 'email' => $user->getEmail(), 'firstname' => $user->getFirstname(), 'lastname' => $user->getLastname(), ]; $request->getSession()->set('datas', $datas); $redirect = $response->body->redirect_to; return $this->redirect($redirect, 301); } public function loginldap(Request $request): Response { $challenge = $request->query->get('login_challenge'); // S'il n'y a pas de challenge, on déclenche une bad request if (!$challenge) { throw new BadRequestException('pas de challenge'); } // On vérifie que la requête d'identification provient bien de hydra $response = $this->apiservice->run('GET', $this->getParameter('hydraLoginchallenge').$challenge, null); if (!$response) { throw new BadRequestException('challenge invalide'); } // si le challenge est validé par hydra, on le stocke en session pour l'utiliser par la suite et on redirige vers une route interne protégée qui va déclencher l'identification FranceConnect $request->getSession()->set('hydraChallenge', $challenge); // Création du formulaire $form = $this->createForm(LoginType::class); // Récupération des data du formulaire $form->handleRequest($request); // Affichage du formulaire return $this->render('Home/loginHYDRA.html.twig', [ 'useheader' => false, 'usemenu' => false, 'usesidebar' => false, 'form' => $form->createView(), 'mode' => 'LDAP', ]); } public function checkloginldap(Request $request, ManagerRegistry $em) { $username = $request->get('login')['username']; $password = $request->get('login')['password']; // L'utilisateur se co à l'annuaire ? $userldap = $this->ldapservice->userconnect($username, $password); if (!$userldap) { return $this->redirect($this->generateUrl('app_hydra_loginldap', ['login_challenge' => $request->getSession()->get('hydraChallenge')])); } $userldap = $userldap[0]; // Init $email = "$username@nomail.fr"; $lastname = $username; $firstname = ' '; // Rechercher l'utilisateur if (isset($userldap[$this->getParameter('ldapFirstname')])) { $firstname = $userldap[$this->getParameter('ldapFirstname')]; } if (isset($userldap[$this->getParameter('ldapLastname')])) { $lastname = $userldap[$this->getParameter('ldapLastname')]; } if (isset($userldap[$this->getParameter('ldapEmail')])) { $email = $userldap[$this->getParameter('ldapEmail')]; } $response = $this->apiservice->run('PUT', $this->getParameter('hydraLoginchallengeaccept').$request->getSession()->get('hydraChallenge'), ['subject' => $email, 'acr' => 'string']); if (!$response || '200' != $response->code) { throw new BadRequestException('login accept invalide'); } $datas = [ 'username' => $username, 'email' => $email, 'firstname' => $firstname, 'lastname' => $lastname, ]; $request->getSession()->set('datas', $datas); $redirect = $response->body->redirect_to; return $this->redirect($redirect, 301); } public function consent(Request $request) { $challenge = $request->query->get('consent_challenge'); if (!$challenge) { throw new BadRequestException("Le challenge n'est pas disponible"); } // On vérifie que la requête d'identification provient bien de hydra $response = $this->apiservice->run('GET', $this->getParameter('hydraConsentchallenge').$challenge, null); if (!$response) { throw new BadRequestException('challenge invalide'); } $response = $this->apiservice->run('PUT', $this->getParameter('hydraConsentchallengeaccept').$challenge, [ 'grant_scope' => ['openid', 'offline_access'], 'session' => ['id_token' => $request->getSession()->get('datas')], ]); if (!$response) { throw new BadRequestException('challenge not accept'); } $redirect = $response->body->redirect_to; return $this->redirect($redirect, 301); } }