Compare commits
No commits in common. "c39f6ba4d79dab3b90ddee5932cef30e5b67c3f2" and "328f420bf18c5f23bb62180b13da126631f3ce92" have entirely different histories.
c39f6ba4d7
...
328f420bf1
@ -1,40 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "kor-elf/captcha-rule-for-laravel",
|
|
||||||
"description": "Validation Rule Captcha for Laravel",
|
|
||||||
"license": "MIT",
|
|
||||||
"type": "library",
|
|
||||||
"keywords": [
|
|
||||||
"captcha",
|
|
||||||
"laravel",
|
|
||||||
"validation"
|
|
||||||
],
|
|
||||||
"homepage": "https://git.kor-elf.net/kor-elf/captcha-rule-for-laravel",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Leonid Nikitin",
|
|
||||||
"email": "i@kor-elf.net",
|
|
||||||
"homepage": "https://git.kor-elf.net/kor-elf",
|
|
||||||
"role": "Developer"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"require": {
|
|
||||||
"php": "^8.2",
|
|
||||||
"illuminate/support": "^10.0",
|
|
||||||
"guzzlehttp/guzzle": "^7.0.1"
|
|
||||||
},
|
|
||||||
"extra": {
|
|
||||||
"laravel": {
|
|
||||||
"providers": [
|
|
||||||
"korElf\\CaptchaRuleForLaravel\\CaptchaProvider"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"korElf\\CaptchaRuleForLaravel\\": "src/"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"src/helpers.php"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copyright (c) 2023
|
|
||||||
* author: Leonid Nikitin - i@kor-elf.net
|
|
||||||
* web: https://git.kor-elf.net/kor-elf
|
|
||||||
* Initial version created on: 02.12.2023
|
|
||||||
* MIT license: https://git.kor-elf.net/kor-elf/captcha-rule-for-laravel/src/branch/main/LICENSE.md
|
|
||||||
*/
|
|
||||||
|
|
||||||
return [
|
|
||||||
/*
|
|
||||||
* Указываем адрес к сервису для проверки от робота.
|
|
||||||
* Примеры: http://captcha.localhost:9008, https://captcha.localhost, http://captcha.localhost
|
|
||||||
*/
|
|
||||||
'api_domain' => env('CAPTCHA_API_DOMAIN'),
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Приватный токен для проверки получаемого ключа после успешной проверки от бота.
|
|
||||||
*/
|
|
||||||
'api_private_token' => env('CAPTCHA_PRIVATE_TOKEN'),
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Curl timeout в секундах.
|
|
||||||
*/
|
|
||||||
'curl_timeout' => (int) env('CAPTCHA_CURL_TIMEOUT', 10),
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Включает Blade::directive "captcha".
|
|
||||||
*/
|
|
||||||
'enable_blade_captcha' => (bool) env('CAPTCHA_ENABLE_BLADE_CAPTCHA', true),
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Публичный токен для начало проверки я не робот.
|
|
||||||
*/
|
|
||||||
'api_public_token' => env('CAPTCHA_PUBLIC_TOKEN'),
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Указываем путь к статике, на данный момент это к стилям.
|
|
||||||
* Примеры: /captcha, https://captcha.localhost/captcha
|
|
||||||
*/
|
|
||||||
'static_path' => env('CAPTCHA_STATIC_PATH', env('CAPTCHA_API_DOMAIN') . '/captcha'),
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Используется в переводах.
|
|
||||||
*/
|
|
||||||
'error_message_key' => 'validation.captcha',
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Имя Validator::extendImplicit.
|
|
||||||
*/
|
|
||||||
'rule_name' => 'captcha',
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Name в input после успешной проверки.
|
|
||||||
*/
|
|
||||||
'captcha_verified_name' => 'captcha-verified',
|
|
||||||
];
|
|
@ -1,60 +0,0 @@
|
|||||||
<?php declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace korElf\CaptchaRuleForLaravel;
|
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Validator;
|
|
||||||
use Illuminate\Support\ServiceProvider;
|
|
||||||
use Illuminate\Support\Facades\Blade;
|
|
||||||
use Illuminate\Contracts\Foundation\Application;
|
|
||||||
|
|
||||||
final class CaptchaProvider extends ServiceProvider
|
|
||||||
{
|
|
||||||
public function boot(): Void
|
|
||||||
{
|
|
||||||
$this->addValidationRule();
|
|
||||||
$this->publishes([
|
|
||||||
__DIR__ . '/../config/captcha.php' => config_path('captcha.php'),
|
|
||||||
], 'config');
|
|
||||||
|
|
||||||
if (config('captcha.enable_blade_captcha')) {
|
|
||||||
Blade::directive('captcha', function () {
|
|
||||||
return "<?php echo \korElf\CaptchaRuleForLaravel\htmlCaptcha(); ?>";
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extends Validator to include a captcha type
|
|
||||||
*/
|
|
||||||
public function addValidationRule(): Void
|
|
||||||
{
|
|
||||||
$message = trans(config('captcha.error_message_key'));
|
|
||||||
Validator::extendImplicit(config('captcha.rule_name'), function ($attribute, $value) {
|
|
||||||
if (!is_string($value)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return app(CaptchaService::class)->validate($value, request()->userAgent());
|
|
||||||
}, $message);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register the service provider.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function register(): Void
|
|
||||||
{
|
|
||||||
$this->mergeConfigFrom(
|
|
||||||
__DIR__ . '/../config/captcha.php',
|
|
||||||
'captcha'
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->app->singleton(CaptchaService::class, function (Application $app) {
|
|
||||||
return new CaptchaService(
|
|
||||||
privateToken: config('captcha.api_private_token', ''),
|
|
||||||
domainApi: config('captcha.api_domain', ''),
|
|
||||||
curlTimeout: config('captcha.curl_timeout', ''),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
<?php declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace korElf\CaptchaRuleForLaravel;
|
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Http;
|
|
||||||
|
|
||||||
final readonly class CaptchaService
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
private string $privateToken,
|
|
||||||
private string $domainApi,
|
|
||||||
private int $curlTimeout = 10,
|
|
||||||
) { }
|
|
||||||
|
|
||||||
public function validate(string $token, ?string $userAgent = null): bool
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
$post = [];
|
|
||||||
if (!is_null($userAgent)) {
|
|
||||||
$post['user_ageng'] = $userAgent;
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = Http::withHeaders([
|
|
||||||
'private-token' => $this->privateToken,
|
|
||||||
])
|
|
||||||
->timeout($this->curlTimeout)
|
|
||||||
->post($this->domainApi . '/api/v1/captcha/' . $token, $post);
|
|
||||||
|
|
||||||
return ($response->json('status') === true);
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
<?php declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace korElf\CaptchaRuleForLaravel;
|
|
||||||
|
|
||||||
function htmlCaptcha(): string
|
|
||||||
{
|
|
||||||
return '<div class="captcha-service-kor-elf" data-domain="' . config('captcha.api_domain') . '" data-static-path="' . config('captcha.static_path') . '" data-token="' . config('captcha.api_public_token') . '" data-captcha-verified-name="' . config('captcha.captcha_verified_name') . '"></div><script src="' . config('captcha.static_path') . '/script.js" async></script>';
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user