Použití reCAPTCHA v Nette formuláři

bdinvpvsmvpscuiqpc
Člen | 57
+
0
-

Ahoj, jak mám použít reCAPTCHu v Nette formuláři?

chemix
Nette Core | 1296
+
0
-

@bdinvpvsmvpscuiqpc treba pomoci : https://contributte.org/…CAPTCHA.html

bdinvpvsmvpscuiqpc
Člen | 57
+
+1
-

Pokud použiji invisible reCAPTCHu, tak to nefunguje. Po odeslání formuláře to vypíše: This field is required.

Editoval bdinvpvsmvpscuiqpc (19. 2. 2021 21:57)

bdinvpvsmvpscuiqpc
Člen | 57
+
0
-

Nevíte, proč to nefunguje a jak to opravit?

pavelplzak
Člen | 21
+
0
-

bdinvpvsmvpscuiqpc napsal(a):

Nevíte, proč to nefunguje a jak to opravit?

Hoj, taky se mi zobrazovalo jen „This field is required.“, pokud tam chci dostat vlastní hlášku, musel jsem to udělat takto:

php $form->addReCaptcha('recaptcha', 'Antispam')->setRequired('Potvrďte prosím, že jste člověk.');
kajinek32
Člen | 31
+
0
-

pavelplzak napsal(a):

bdinvpvsmvpscuiqpc napsal(a):

Nevíte, proč to nefunguje a jak to opravit?

Hoj, taky se mi zobrazovalo jen „This field is required.“, pokud tam chci dostat vlastní hlášku, musel jsem to udělat takto:

php $form->addReCaptcha('recaptcha', 'Antispam')->setRequired('Potvrďte prosím, že jste člověk.');

Mám podobný problém – vyhazuje to hlášku „this field is required“, nicméně nejde o to, že bych chtěl hlášku změnit, spíš o to, že se asi neprovede validace (invisible) recaptchy a tím pádem se formulář neodešle…

V consoli nic není, javascript je správně načtený…

pazuzu
Člen | 29
+
0
-

Ahoj, mam uplne ten stejny problem, pokud je invisible a required je TRUE, tak vyzaduje vyplneni toho pole a neodesle se…
nasel jsi na to nejake reseni?

emololftw
Člen | 81
+
0
-

pazuzu napsal(a):

Ahoj, mam uplne ten stejny problem, pokud je invisible a required je TRUE, tak vyzaduje vyplneni toho pole a neodesle se…
nasel jsi na to nejake reseni?

Mám to naprosto stejně s verzí v2 INVISIBLE, pokud zadám secretKey a siteKey pro v3 vše běží OK.

Edit: tak jenom pokud se jedná o ne-ajax požadavek

Editoval emololftw (14. 4. 2022 10:57)

mario85
Člen | 22
+
0
-

Ahoj,
je nějaká varianta jak reCaptchu implementovat, i když používám z Nette jen formuláře a ne celý framework?

Díky

dms
Člen | 87
+
0
-

Ahoj používáme takovej easy vlastní input. Je to Recaptcha Enterprise (měla by to být ta nejnovější a nejspolehlivější). Posílám skripty jak to cca vypadá. Je to použitelné samostatně pouze v nette formech

AntiSpamRecaptcha.php

<?php

use GuzzleHttp\Client;
use Nette\Forms\Controls\BaseControl;
use Nette\Forms\Controls\HiddenField;
use Nette\Forms\Form;

class AntiSpamRecaptcha extends HiddenField
{
    public function __construct(
        private $googleRecaptchaEnterpriseProject,
        private $googleRecaptchaEnterpriseApiKey,
        private $googleRecaptchaEnterpriseKey
    ) {
        parent::__construct();

        $this->setRequired();
        $this->addRule([$this, "validateRecaptcha"], "spam");
    }

    public function validateRecaptcha(BaseControl $field): bool
    {
        $client = new Client();
        $response = $client->request(
            "POST",
            "https://recaptchaenterprise.googleapis.com/v1beta1/projects/{$this->googleRecaptchaEnterpriseProject}/assessments?key={$this->googleRecaptchaEnterpriseApiKey}",
            [
                "json" => [
                    "event" => [
                        "token" => $field->getValue(),
                        "siteKey" => $this->googleRecaptchaEnterpriseKey,
                        "userAgent" => $_SERVER["HTTP_USER_AGENT"],
                        "userIpAddress" => $_SERVER["REMOTE_ADDR"],
                        "expectedAction" => "form",
                    ],
                ],
                "http_errors" => false,
            ]
        );

        if ($response->getStatusCode() !== 200) {
            return false;
        }

        $response = $response->getBody()->getContents();
        $response = json_decode($response, null, 512, JSON_THROW_ON_ERROR);

        if (
            !isset($response->tokenProperties->valid) ||
            $response->tokenProperties->valid !== true
        ) {
            return false;
        }

        if (!isset($response->score) || $response->score < 0.8) {
            return false;
        }

        return true;
    }
}

NejakyForm.php

$form->addComponent(new AntiSpamRecaptcha('a', 'b', 'c'), 'gtoken');

Html a javascript

<form n:name=mujform>
	<input n:name=gtoken>
</form>

<script src="https://www.google.com/recaptcha/enterprise.js?render=KEY_ID"></script>
<script>
grecaptcha.enterprise.ready(async () => {
    const token = await grecaptcha.enterprise.execute('KEY_ID', {action: 'form'});
	document.querySelector('[name="gtoken"]').value = token
});
</script>
kajinek32
Člen | 31
+
0
-

bdinvpvsmvpscuiqpc napsal(a):

Pokud použiji invisible reCAPTCHu, tak to nefunguje. Po odeslání formuláře to vypíše: This field is required.

Odpovím po letech sám, dnes jsem na to přišel :)

Je opravdu nutné, aby ten JS

<script src="https://www.google.com/recaptcha/api.js?render=explicit"></script>
<script src="{$basePath}/assets/invisibleRecaptcha.js"></script>

byl opravdu na konci, těsně před

</body>

V dokumentaci to píšou, jen jsem tomu nepřikládal takový zřetel…