Private
Public Access
chg: usr: replace Google ReCaptcha with Cap instance #13
This commit is contained in:
@@ -26,50 +26,38 @@ use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||
*/
|
||||
readonly final class RecaptchaService
|
||||
{
|
||||
private const string SITEVERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify';
|
||||
|
||||
/**
|
||||
* Minimum score to accept a request (0.0 = bot, 1.0 = human).
|
||||
* 0.5 is Google's recommended default threshold.
|
||||
*/
|
||||
private const float SCORE_THRESHOLD = 0.5;
|
||||
|
||||
public function __construct(
|
||||
private HttpClientInterface $httpClient,
|
||||
private LoggerInterface $logger,
|
||||
#[Autowire(env: 'RECAPTCHA_SECRET_KEY')]
|
||||
#[Autowire(env: 'CAP_API_ENDPOINT')]
|
||||
private string $apiEndpoint,
|
||||
#[Autowire(env: 'CAP_SECRET_KEY')]
|
||||
private string $secretKey,
|
||||
) {}
|
||||
|
||||
public function verify(string $token, string $remoteIp = ''): bool
|
||||
public function verify(string $token): bool
|
||||
{
|
||||
if ($token === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$body = ['secret' => $this->secretKey, 'response' => $token];
|
||||
|
||||
if ($remoteIp !== '') {
|
||||
$body['remoteip'] = $remoteIp;
|
||||
}
|
||||
$siteverifyUrl = rtrim($this->apiEndpoint, '/') . '/siteverify';
|
||||
|
||||
$data = $this->httpClient
|
||||
->request('POST', self::SITEVERIFY_URL, ['body' => $body])
|
||||
->request('POST', $siteverifyUrl, [
|
||||
'body' => ['secret' => $this->secretKey, 'response' => $token],
|
||||
])
|
||||
->toArray();
|
||||
|
||||
$this->logger->info('reCAPTCHA verify response', [
|
||||
'success' => $data['success'] ?? null,
|
||||
'score' => $data['score'] ?? null,
|
||||
'hostname' => $data['hostname'] ?? null,
|
||||
'error-codes' => $data['error-codes'] ?? [],
|
||||
'token_length' => strlen($token),
|
||||
$this->logger->info('Cap verify response', [
|
||||
'success' => $data['success'] ?? null,
|
||||
'token_length' => strlen($token),
|
||||
]);
|
||||
|
||||
return ($data['success'] ?? false) === true
|
||||
&& ($data['score'] ?? 0.0) >= self::SCORE_THRESHOLD;
|
||||
return ($data['success'] ?? false) === true;
|
||||
} catch (\Throwable $e) {
|
||||
$this->logger->error('reCAPTCHA verification failed: ' . $e->getMessage());
|
||||
$this->logger->error('Cap verification failed: ' . $e->getMessage());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user