Показ капчи по запросу бэкенда
-
Установите VK Капча SDK.
-
Добавьте во фронтенд импорт функции
checkCaptchaError:import { checkCaptchaError } from '@vkid/captcha'; -
Отправьте бэкенду запрос на целевое действие пользователя.
-
Передайте ответ в функцию
checkCaptchaError(). Функция разберет ответ и вернет ссылку для запуска виджета капчи, если капча потребовалась. -
Отобразите капчу пользователю. Воспользуйтесь методом SDK captchaWidget.show().
Метод вернет promise-объект с результатом прохождения капчи: токен успешного прохождения капчи, если пользователь прошел капчу, или ошибку, если пользователь закрыл капчу.
-
Обработайте результат прохождения капчи:
- Если promise-объект содержит токен успешного прохождения капчи, повторите исходный запрос на целевое действие пользователя, добавив к нему токен.
- Если пользователь закрыл капчу, бэкенду ничего не отправляется. Определите, что будет происходить во фронтенде в этом случае.
Пример кода на TypeScript:
import { checkCaptchaError } from '@vkid/captcha';async function onSubmit(credentials: Credentials) {// Запрос на действие пользователя. О капче фронтенд пока ничего не знаетconst response = await fetch('/api/legacy/login', {method: 'POST',body: JSON.stringify({ ...credentials, client }),});const data = await response.json();// Ссылку для запуска капчи вручную задавать не нужно, ее возвращает функция checkCaptchaError().const { captchaType, captchaWidget } = checkCaptchaError({responseHeaders: response.headers,url: response.url,responseError: data.error,withWidget: true, // Без этого параметра вернется только адрес, без виджета});if (captchaType === null) {return finish(data); // Капча не потребовалась}if (!captchaWidget) {// Капча нужна, но собрать виджет не удалось: в ответе нет адреса капчиreturn handleUnknownCaptcha(data);}const captchaToken = await captchaWidget.show({container: document.body,view: 'popup',lang: 'ru',});// Тот же запрос на действие пользователя, но с токеном прохождения капчиawait fetch('/api/legacy/login', {method: 'POST',body: JSON.stringify({ ...credentials, client, captchaToken }),});}
Была ли статья полезна?