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:
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');
}
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
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
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.
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