Laravel + Voyager + Recaptcha

Posted on 2023-02-01 02:58:14

Necə edirik? Admin panel login nümunəsində

REKAPTÇANI ƏLAVƏ EDİRİK

Voyager admin panelində dəyişiklik etmək üçün gərək müəyyən voyager faylları override olunsun. Buna nail olmaq üçün biz Voyagerin rəsmi sənədləşməsinə baxa bilərik. Dediyinə görə əgər biz view fayllarını dəyişmək istəyiriksə, o zaman biz resources/views/vendor/voyager qovluğunun daxilində yeni eyni adlı fayllar yaratmalıyıq.

…/vendor/voyager qovluğu

Sonra cüzi dəyişik login.blade.php və master.blade.php səhifələrinə edirik.

login.blade.php:

<div class="g-recaptcha" data-sitekey="{{env("GOOGLE_RECAPTCHA_KEY")}}"></div>
<br/>
Nəticədə login.blade.php faylı

Master.blade.php:

{{--    google recapthca--}}
<script src="https://www.google.com/recaptcha/api.js?hl=az" async defer></script>
Nəticədə master.blade.php faylında əlavə etdiyimiz kod
?hl=az yazmaqla recaptçanın dilini Azərbaycan dili edirik.

AUTENTİFİKASİYA

Recaptchanın işləməsi üçün biz gərək AuthControllerimizdə dəyişiklik edək. Nəzərə alsaq ki biz Voyager istifadə edirik, deməli voyagerin Controllerlərin override etməliyik. Voyager özü, bunu başınız çıxırsa etməyi məsləhət görür. Ola bilsin situasiyadan asılı olaraq vəziyyət dəyişsin və Override etməklə nəyisə sındırmış olasınız. Ona görə ehtiyatlı olun.

Voyagerin sənədləşməsinə əsasən biz config/voyager.php faylında növbəti dəyişikliyi etməliyik:

---- Əvvəl ----
'controllers' => [
'namespace' => 'TCG\\Voyager\\Http\\Controllers',
],

---- Sonra ----
'controllers' => [
'namespace' => 'App\\Http\\Controllers\\Voyager',
],

Sonra php artisan voyager:controllers işlədərək Voyagerin controllerlərin publish etmish oluruq. Yəni Voyagerin controllerləri app/Http/Controllers/Voyager qovluğu altında yerləşdirilir. Burada bizi maraqlandıran VoyagerAuthController.php faylıdır.

Normalda daxilində sadəcə sinif olacaq hansı ki, BaseVoyagerAuthController sinifindən extend edir (törəyir). Rekaptchanın validasiyasını etmək üçün biz burada postLogin(Request $request) methodunu gərək override edək.

Sonda metodun kodu belə olacaq:

public function postLogin(Request $request)
{
$this->validate($request, [
$this->username() => 'required|string',
'password' => 'required|string',
'g-recaptcha-response' => function ($attribute, $value, $fail) {
try {
$secretKey = env("GOOGLE_RECAPTCHA_SECRET");
$remoteIp = $_SERVER["REMOTE_ADDR"];
$url = "https://www.google.com/recaptcha/api/siteverify?secret=$secretKey&response=$value&remoteip=$remoteIp";

// verify captcha
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$response = json_decode($output);

if(!$response->success){
$fail($attribute." google reCapthca failed!");
}
} catch (\Exception $e) {
Log::error($e->getMessage());
$fail("Something went wrong! Please email or call us! Thanks!");
}
},
]);

// If the class is using the ThrottlesLogins trait, we can automatically throttle
// the login attempts for this application. We'll key this by the username and
// the IP address of the client making these requests into this application.
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);

return $this->sendLockoutResponse($request);
}

$credentials = $this->credentials($request);

if ($this->guard()->attempt($credentials, $request->has('remember'))) {
return $this->sendLoginResponse($request);
}

// If the login attempt was unsuccessful we will increment the number of attempts
// to login and redirect the user back to the login form. Of course, when this
// user surpasses their maximum number of attempts they will get locked out.
$this->incrementLoginAttempts($request);

return $this->sendFailedLoginResponse($request);
}

Password-un şifrələnməsi versiyaya görə fərqlənə bilər. Əgər “Credentials not match” xətası alırsınızsa böyük ehtimal səbəb şifrələnmədədir. Amma ümid edirəm problemsiz alınacaq. Alınmasa da bizimlə əlaqə saxlaya bilərsiniz. Necə? Burada linklər var.

Yəginki env(“GOOGLE_RECAPTCHA_SECRET”) və env(“GOOGLE_RECAPTCHA_KEY”) fikir verdiniz. Bəli biz .env faylında ayar kimi GOOGLE_RECAPTCHA_SECRET və GOOGLE_RECAPTCHA_KEY dəyərlərini təyin etməliyik. Əlbəttə biz ağlımıza gələni orada azmırıq. Secret və Key əldə etmək üçün gedirik bu sayta: https://www.google.com/recaptcha/admin/create. Domenin adını və digər lazım olan məlumatları qeyd edirsiniz və mən v2 istifadə edəcəm deyə onu seçirəm, sizə key və secret generate olunur.

QEYD: Recaptcha açarları generasiya edilməsi üçün Google akauntuna giriş etməli olacaqsınız.

GOOGLE_RECAPTCHA_KEY=buradagenersiyaolunmuşkodolmalıdır
GOOGLE_RECAPTCHA_SECRET=buradagenersiyaolunmuşkodolmalıdır

Bununla da işi tamamlamaq olar. Ümid edirəm. Problemsiz bütün addımları keçib, nəticəni əldə edə bildiniz. Videosunu Udemy kursumuzda paylaşmağı düşünürəm. Maraqlı olarsa buyurun. Kursu almaqla, bizə dəstək ola bilərsiniz. Təşəkkür edirəm. Sağ olun.