В моем приложении VueJS с модулем узла vue-recaptcha-v3
, reCAPTCHA v3 постоянно завершается ошибкой на этапе проверки . Баннер «Защищено reCAPTCHA» появляется на странице, как и должно быть, и ответ, который я получаю перед этапом проверки, в порядке. Когда я пытаюсь POST
токен https://www.google.com/recaptcha/api/siteverify
через fetch
:
// Execute reCAPTCHA with action "login".
const response = await this.$recaptcha('contact');
const data = {
secret: secretKey,
response,
};
try {
const validationResponse = await fetch(validationUrl, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});
[...]
, я просто получаю сообщение об ошибке Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.google.com/recaptcha/api/siteverify. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Так что вместо этого я использую mode: 'no-cors'
:
[...]
const validationResponse = await fetch(validationUrl, {
method: 'POST',
mode: 'no-cors',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});
[...]
, что приводит к этому ответу:
{
"success": false,
"error-codes": [
"missing-input-response",
"missing-input-secret"
]
}
Я полагаю, вы не можете отправить тип контента json в режиме no-cors
(https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#Supplying_request_options), поэтому вместо этого я использую multipart/form-data
в качестве типа контента:
const response = await this.$recaptcha('contact');
const formData = new FormData();
formData.append('secret', secret_key);
formData.append('response', response);
try {
const validationResponse = await fetch(validationUrl, {
method: 'POST',
mode: 'no-cors',
headers: {
Accept: 'application/json',
'Content-Type': 'multipart/form-data',
},
body: formData,
});
[...]
Но это только приводит к этому ответу от Google:
<HTML>
<HEAD>
<TITLE>Bad Request</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Bad Request</H1>
<H2>Error 400</H2>
</BODY>
</HTML>
Я действительно не не знаю, что делать дальше - чего мне не хватает?