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 | 1310
+
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 | 35
+
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 | 82
+
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 | 94
+
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 | 35
+
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…

pista5
Člen | 72
+
0
-

Ahoj, funguje to prosim nekomu pri odeslani formulare AJAXem?

Miellap
Člen | 12
+
0
-

pista5 napsal(a):

Ahoj, funguje to prosim nekomu pri odeslani formulare AJAXem?

Ahoj, změnila se adresa pro načtení netteForms.js, nově je to
https://unpkg.com/nette-forms@3
případně pro konkrétní verzi:
https://unpkg.com/…etteForms.js

(původní: https://nette.github.io/…Forms.min.js)

Tím, že na původní adrese se už soubor nenachází, tak knihovny jako třeba nette.ajax.js zhavarují, protože předpokládají existenci proměnné Form z netteForms.js a proto přestane ajax fungovat. Taky jsem to hledala, ale bohužel jsem o téhle migraci nikde nenašla zmínku. Zjistila jsem jen, že na starém odkaze se již soubor nenachází a až při kontrole dokumentace jsem narazila na tu novou adresu.

pista5
Člen | 72
+
0
-

Asi jsem otazku polozil moc strucne… navazoval jsem na predchozi prispevky :))

Pokud do formulare pridam invisible reCaptchu, funguje mi odeslani pouze, pokud se formular neodesila AJAXem… pokud se odesila AJAXem, obdrzim hlasku: This field is required.

Miellap
Člen | 12
+
0
-

pista5 napsal(a):

Asi jsem otazku polozil moc strucne… navazoval jsem na predchozi prispevky :))

Pokud do formulare pridam invisible reCaptchu, funguje mi odeslani pouze, pokud se formular neodesila AJAXem… pokud se odesila AJAXem, obdrzim hlasku: This field is required.

Ano, to se přesně děje v tom, co jsem popsala, ajax se normálně spustil, ale díky chybějící knihovně zhavaroval javascript při formulářové validaci (a to i když ji máme vypnutou) a došlo k tomu, že se nespustil kód pro obsluhu recaptcha, který měl naplnit hidden prvek tím tokenem. Serverová validace pak hlásila – This field is required.

Editoval Miellap (12. 8. 10:43)

jAkErCZ
Člen | 322
+
0
-

Ahoj,
mám problém mám přidanou

public function createComponentLeadForm(): Form
    {
        $form = new Form;

        $form->addEmail('email', 'E-mail')
            ->setHtmlAttribute('placeholder', 'E-mail')
            ->addRule(FormAlias::FILLED, 'E-mail je povinná položka.')
            ->addRule(FormAlias::EMAIL, 'Email nemá správný formát');

        $form->addText('phone', 'Telefon')
            ->setHtmlAttribute('placeholder', 'Telefon')
            ->setRequired('Telefon je povinná položka.');

        $form->addCheckbox('toc', 'Souhlas')
            ->setRequired('Musíte souhlasit s podmínkami.');

        $form->addInvisibleReCaptcha('recaptcha', $required = TRUE, $message = 'Opravdu nejste robot? fff');

        if ($this->token){
            $form->addSelect('team', 'Pozvánka do týmu')
                ->setHtmlAttribute('class', 'form-control')
                ->setPrompt('Bez týmu');
        } else {
            $form->addHidden('team');
        }

        $form->addSubmit('submit', 'Vytvořit profil');

        //$form->onValidate[] = [$this, 'processValid'];
        $form->onSuccess[] = [$this, 'registerSucceed'];
        return $form;
    }

A poté před </body>

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

ale i tak po odeslání formu dostávám.

Chyba: This field is required.

Nevíte jak to zprovoznit?