Livewire에서 Google reCaptcha v2를 사용하는 방법
설정을 완료하면 Google reCaptcha API 키와 암호를 프로젝트에 추가하고 싶을 것입니다. 저는
config/services.php
에 내 키를 추가했습니다.'recaptcha' => [
'key' => env('RECAPTCHA_API_KEY'),
'secret' => env('RECAPTCHA_SECRET_KEY'),
],
이제 우리는 그것들을 그렇게 참조할 수 있습니다.
config('services.recaptcha.key')
config('services.recaptcha.secret')
Google reCaptcha 초기화
프로젝트에 Google reCaptcha JavaScript 코드를 추가해야 합니다. 레이아웃 내에서
<head>
에 다음을 추가합니다.<script
src="https://www.google.com/recaptcha/api.js?onload=handleRecaptchaLoad&render=explicit"
async
defer
></script>
여기서 우리는
onload
함수를 트리거하는 handleRecaptchaLoad
이벤트가 있음을 선언합니다.</body>
태그 앞에 다음을 추가합니다.<script>
let captchaIds = ['recaptchaA', 'recaptchaB', 'recaptchaC', 'recaptchaD']
function handleRecaptchaLoad() {
captchaIds.forEach((captchaId) => {
if (!document.getElementById(captchaId)) {
return
}
grecaptcha.render(
captchaId, {
'sitekey': '{{ config('services.recaptcha.key') }}',
'callback': `${captchaId}Submit`
}
)
})
}
window.addEventListener('reset-google-recaptcha', () => {
captchaIds.forEach((captchaId) => {
if (!document.getElementById(captchaId)) {
return
}
grecaptcha.reset(captchaId)
})
})
</script>
무슨 일이야?
handleRecaptchaLoad
함수는 captchaIds
배열을 반복하고 다음을 수행합니다.id
.id
를 기반으로 함수에 콜백을 추가합니다.그러면
recaptchaASubmit
와 같은 콜백 함수 이름이 생성됩니다.왜 이 접근법인가?
이를 통해 서로 간섭하지 않고 동일한 페이지에서 여러 Google reCaptcha 구성 요소를 사용할 수 있습니다.
단일 Google reCaptcha 구성 요소에서도 잘 작동하지만 추가 코드를 제거하려면 이렇게 합니다.
function handleRecaptchaLoad() {
grecaptcha.render(
captchaId, {
'sitekey': '{{ config('services.recaptcha.key') }}',
'callback': 'recaptchaComponentSubmit'
}
)
}
window.addEventListener('reset-google-recaptcha', () => {
grecaptcha.reset('recaptchaComponentSubmit')
})
맞춤 이벤트를 수신하는 창에 이벤트 리스너가 있습니다
reset-google-recaptcha
. 이 리스너가 트리거되면 Google reCaptcha 구성 요소가 재설정됩니다. 페이지가 다시 로드되지 않으므로 Livewire를 사용할 때 필요합니다.Google reCaptcha 블레이드 구성 요소
Google reCaptcha가 연결되도록 마크업을 추가해야 합니다. 저는 이 작업을 Blade 구성요소로 수행했습니다.
@props(['id'])
@push('scripts')
<script>
function {{ $id }}Submit(captchaToken) {
@this.handleRecaptcha(captchaToken)
}
</script>
@endpush
<div>
<div id="{{ $id }}"
wire:ignore></div>
@error('recaptcha')
{{ $message }}
@enderror
</div>
무슨 일이야?
이 구성 요소는
id
의 단일 소품을 허용하고 다음을 수행합니다.id
소품을 통해 고유한 함수 생성scripts
스택으로 푸시이 고유 함수는
handleRecaptchaLoad
함수에 선언된 콜백 함수까지 일치합니다.라이브와이어와 대화하기
@this.handleRecaptcha(captchaToken)
를 사용하여 Google reCaptcha(captchaToken
)의 응답을 Livewire로 전달합니다.아직 레이아웃에
@stack('scripts')
를 추가했는지 확인하지 않은 경우.Livewire 구성 요소에 연결
이제 Google reCaptcha 구성 요소를 Livewire에 연결해야 합니다. 이 예에서는
Contact.php
라는 Livewire 구성 요소를 사용합니다.먼저
livewire/contact.blade.php
내의 양식에 블레이드 구성 요소를 추가해야 합니다.<form>
<x-form.recaptcha id="contactRecaptcha" />
</form>
Livewire 구성 요소에서는 Google reCaptcha가 확인되었는지 추적하고 양식 제출을 처리할 수 있도록 상태 및 메서드가 필요합니다.
class Contact extends Component
{
use InteractsWithRecaptcha;
public $recaptcha = false;
protected $rules = [
'recaptcha' => 'accepted',
];
protected function messages()
{
return [
'recaptcha.accepted' => 'reCaptcha is required.',
];
}
public function handleRecaptcha($captchaToken)
{
$this->recaptcha = $this->validateRecaptchaRequest($captchaToken);
}
public function submitForm()
{
$this->validate();
$this->reset();
$this->resetRecaptchaComponent();
session()->flash('contact.success', 'Message sent!');
}
public function render()
{
return view('livewire.contact');
}
}
우리는
InteractsWithRecaptcha
라는 사용자 지정 특성을 사용하고 있습니다.필수는 아니지만 여러 Google reCaptcha 구성 요소로 작업하는 경우 권장됩니다.
그 모습은 다음과 같습니다.
trait InteractsWithRecaptcha
{
public function validateRecaptchaRequest($captchaToken)
{
$captchaResponse = Http::asForm()->post('https://www.google.com/recaptcha/api/siteverify', [
'secret' => config('services.recaptcha.secret'),
'response' => $captchaToken,
])->json();
return $captchaResponse['success'];
}
public function resetRecaptchaComponent()
{
$this->dispatchBrowserEvent('reset-google-recaptcha');
}
}
Livewire 구성 요소의
handleRecaptcha
함수에서 Google reCaptcha API 끝점에 도달하여 요청을 확인하고 성공 여부를 반환하는 validateRecaptchaRequest
를 호출합니다.Livewire 구성 요소에서 API에서 반환된 값은
recaptcha
상태가 됩니다.false
를 반환하면 양식이 제출될 때 유효성 검사가 실패하고 true
이면 양식이 제출됩니다.양식이 제출되면 Livewire 기능
reset()
을 사용하여 Livewire 구성 요소 상태를 재설정하고 LivewireresetRecaptchaComponent
기능을 사용하여 이벤트dispatchBrowserEvent
를 DOM으로 내보내는 특성에서 reset-google-recaptcha
를 호출합니다. 창문.reset-google-recaptcha
가 트리거되면 Google reCaptcha 구성 요소가 재설정됩니다.Livewire와 함께 작동하는 Google reCaptcha가 있습니다.
이것이 너무 혼란스럽지 않기를 바랍니다. 여러 파일에 걸쳐 서로 대화하는 부분이 많지만 프로젝트에 논리가 추가되면 따라가기가 훨씬 쉬워집니다.
Reference
이 문제에 관하여(Livewire에서 Google reCaptcha v2를 사용하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/markmead/how-to-use-google-recaptcha-v2-with-livewire-45h5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)