load->library('session'); $this->load->helper('url'); $this->load->helper('form'); $this->load->library('form_validation'); } public function show_otpverify() { // Charger la vue 'otpverify' située dans 'application/views/payement' $this->load->view('payment/verify_otp'); } public function first_confirmation(){ $this->load->view('frontoffice/home/payment_confirmation'); } // Valider l'OTP public function validateOtp($otpCodes) { // Vérifier que l'OTP contient exactement 6 chiffres if (strlen($otpCodes) !== 6 || !ctype_digit($otpCodes)) { return false; } return true; } // Vérifier l'OTP public function verifyOtp($otpCodes) { // Vérifier si l'OTP correspond à celui stocké dans la session return $otpCodes === $this->session->userdata('otp'); } public function generate_otp() { // Récupérer le token CSRF envoyé par la requête AJAX // $csrfToken = $this->input->post('csrf_token'); // $serverToken = $this->security->get_csrf_hash(); // // Vérifier la validité du token CSRF // if ($csrfToken !== $serverToken) { // echo json_encode([ // 'success' => false, // 'message' => 'CSRF token invalide.', // 'csrf_token' => $this->security->get_csrf_hash() // Nouveau token // ]); // return; // } // // Limiter les tentatives de génération d'OTP (exemple : 1 par minute) // $lastOtpTime = $this->session->userdata('last_otp_time'); // if ($lastOtpTime && (time() - $lastOtpTime < 60)) { // echo json_encode([ // 'success' => false, // 'message' => 'Veuillez attendre avant de demander un autre OTP.', // 'csrf_token' => $this->security->get_csrf_hash() // ]); // return; // } // Génération de l'OTP $otp = rand(100000, 999999); $expiration_time = time() + (7 * 60); // Expiration dans 7 minutes // Stocker l'OTP, l'heure d'expiration et la dernière génération dans la session $this->session->set_userdata('otp', $otp); $this->session->set_userdata('otp_expiration', $expiration_time); $this->session->set_userdata('last_otp_time', time()); // Définir l'URL de redirection $redirect_url = site_url('verify_otp/otp_verification'); // Retourner la réponse avec l'URL de redirection et le nouveau token CSRF $response = array( 'success' => true, 'redirect_url' => $redirect_url, 'message' => 'OTP généré avec succès !', 'csrf_token' => $this->security->get_csrf_hash() // Nouveau token pour les prochaines requêtes ); echo json_encode($response); } // Vérifier l'OTP soumis par l'utilisateur public function verify_otp() { $user_otp = $this->input->post('otp'); $stored_otp = $this->session->userdata('otp'); $otp_expiration = $this->session->userdata('otp_expiration'); // Vérifier si l'OTP est valide if (!$this->validateOtp($user_otp)) { $this->session->set_flashdata('error', 'OTP invalide. Veuillez entrer un code à 6 chiffres.'); //redirect('verify_otp'); return false; } // Vérifier si l'OTP a expiré if (time() > $otp_expiration) { $this->session->set_flashdata('error', 'L\'OTP a expiré. Veuillez régénérer un nouvel OTP.'); //redirect('verify_otp'); return false; } // Vérifier si l'OTP correspond à celui stocké if ($this->verifyOtp($user_otp)) { $this->session->set_flashdata('success', 'OTP valide ! Vous avez été authentifié avec succès.'); // Supprimer l'OTP après utilisation $this->session->unset_userdata('otp'); $this->session->unset_userdata('otp_expiration'); // redirect('payement/otpV'); } else { $this->session->set_flashdata('error', 'OTP incorrect. Veuillez réessayer.'); // redirect('payement/otpVery'); } } }