Použití reCAPTCHA v Nette formuláři
- bdinvpvsmvpscuiqpc
- Člen | 57
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)
- pavelplzak
- Člen | 21
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
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ý…
- emololftw
- Člen | 82
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)
- dms
- Člen | 94
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
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…
- Miellap
- Člen | 12
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.
- Miellap
- Člen | 12
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
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?