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 | 31
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 | 81
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 | 87
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
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…