web-dev-qa-db-fra.com

$ captcha-> CheckAnswer () renvoie toujours false

Après beaucoup de difficultés, j'ai compris comment implémenter le standard Joomla reCaptcha.

Mais maintenant mon problème est de le vérifier du côté serveur.

Les étapes du reCaptcha:

  1. J'ai un formulaire avec le recaptcha mis en œuvre comme ceci (fonctionne bien) :

    $captcha_plugin = JFactory::getConfig()->get('captcha');
    if ($captcha_plugin != '0') {
        $captcha = JCaptcha::getInstance($captcha_plugin);
        $field_id = 'captcha';
        print $captcha->display($field_id, $field_id, 'g-recaptcha');
    }
    
  2. Lors de l'envoi, j'envoie un AJAX appel à cette URL (fonctionne très bien) :

    'index.php?option=com_content&format=ajax&view=article&task=loginUser&tmpl=component' C'est un fichier que j'ai créé dans com_content> views> article

  3. Le code de ma tâche/fonction loginUser ( non validant , voir fin de la question)

    public function _logInUser( $form ){
        $captcha_plugin = JFactory::getConfig()->get('captcha');
        $captcha = JCaptcha::getInstance($captcha_plugin);
        $completed = $captcha->CheckAnswer($form[2]['value']);
        var_dump($form);
        echo $form[2]['value'];
        var_dump($completed);
        die();
    

Mise à jour: J'ai aussi essayé comme ça, il me donne toujours false quand il devrait retourner vrai:

JPluginHelper::importPlugin('captcha');
$dispatcher = JEventDispatcher::getInstance();
$res = $dispatcher->trigger('onCheckAnswer',$form[2]['value']);
if(!$res[0]){
    var_dump($res);
    die('Invalid Captcha');
}
var_dump($res);
die();

echo $form[2]['value']; Renvoie "" lorsque vous ne cliquez pas sur captcha et renvoie le même résultat: "03AMGVjXgaSV3U5UnezVUIFslFElvrMDe2gOVoJtEwtT9SVMaqG47cyC16CPrl01H3yKVF1y4aaBOnK-E1AeBa1H8XoBE17fN-8L3j0_W5mvO8g9kbrVg-yYEuk1B9lSTWxYfn9kf23yPTY-wlIOijh04vqBwUTLFoiTL-Jw9Ae-l2uvgVrnb1qyBrYt5dtvfRWvwbAx6h6qGXh4WBZz19eFkTv5mTmheGsp4s-5e-VtiqMEQJynNxE0fjxqQxKNyCECAK6SRbtLdZ8NTlDAG4dOd4zfb-R2aIYxwvPOxLjxrlO_5xggTOwqA"

Donc ça doit marcher.

mais cette ligne retourne toujours false: $completed = $captcha->CheckAnswer($form[2]['value']);

et lors de la suppression de $form[2]['value'] dans $captcha->CheckAnswer

Je reçois cette sortie:

Avertissement: argument n ° 1 manquant pour Joomla\CMS\Captcha\Captcha :: checkAnswer (), appelé dans /customers/a/c/e/test-mysite.dk/httpd.www/test/components/com_content/ views/article/view.ajax.php à la ligne 35 et définis dans /customers/a/c/e/test-mysite.dk/httpd.www/test/libraries/src/Captcha/Captcha.php à la ligne 192 Variable non définie: code dans /customers/a/c/e/test-mysite.dk/httpd.www/test/libraries/src/Captcha/Captcha.php à la ligne 200

MISE À JOUR DE L'INFO pour les futurs lecteurs!: Joomla NE fournit PAS reCaptcha pour le formulaire de connexion. Seulement pour l'inscription et le formulaire de contact. Je l'ai trouvé ici: https://forum.joomla.org/viewtopic.php?t=910764

2
JonasB

Tout d'abord, PHP est sensible à la casse. Cela signifie que CheckAnswer et checkAnswer ne sont pas identiques (notez le capital c).

L'utilisation correcte est $captcha->checkAnswer('your_captcha_id').
Quel est le problème de votre approche?
Vous transmettez le résultat de la publication du captcha comme identifiant de votre captcha.

Puisque vous avez utilisé captcha comme $field_id Lorsque vous avez inclus le captcha, vous devez écrire $captcha->checkAnswer('captcha') pour vérifier la réponse.

2
mavrosxristoforos

Cela n'a jamais fonctionné avec la $captcha->checkAnswer() de Joomla.

J'ai donc omis la solution de vérification de Joomla et opté directement pour l'API de vérification de Google.

Voici le code que j'utilise avec succès pour la partie vérification:

$secretKey = "my_secret_key";
$ip = $_SERVER['REMOTE_ADDR'];
$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$form[2]['value']."&remoteip=".$ip);
var_dump($response);

$form[2]['value'] est la réponse du reCaptcha

1
JonasB