Не размещайте API-ключ CAPTCHA в браузерном JavaScript
Храните API-ключ рабочего пространства solvethree на сервере. Браузер управляет формой и сеансом приложения; бэкенд с проверкой подлинности отвечает за создание и получение задач. Не заменяйте утекший браузерный ключ неограниченным маршрутом бэкенда, через который любой желающий сможет расходовать баланс вашего рабочего пространства.
На этой странице
NEXT_PUBLIC — неподходящее место для ключа рабочего пространства
Ключ рабочего пространства используется для аутентификации запросов к solvethree через Authorization: Bearer. Размещая его в JavaScript браузера, в том числе через включенную в сборку публичную переменную окружения вроде NEXT_PUBLIC_SOLVETHREE_API_KEY, вы раскрываете эти учетные данные браузеру. Обфускация значения или его добавление только при прямом вызове fetch не делает его конфиденциальным.
Храните SOLVETHREE_API_KEY в конфигурации, доступной только серверу, и используйте его только в доверенном серверном коде. Браузер должен вызывать маршрут вашего приложения, а не API задач solvethree с ключом вашего рабочего пространства.
Храните входные данные задачи в серверной вспомогательной функции
// Import only from trusted server code. Your application authenticates the caller.
import { Solvethree } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
export async function createCaptchaForLogin(requestId) {
return client.createTask({
site: process.env.CAPTCHA_SITE,
action: 'login',
proxy: process.env.SOLVETHREE_PROXY,
requestId,
}, { waitMs: 0, signal: AbortSignal.timeout(20000) });
}
// The browser calls your authenticated application route, not the solver API.
// Save the returned task ID; retrieve that ID from server code with getTask.
// Submit a ready token using the proxy/browser identity attached to that solve.
// Merely moving the key server-side does not configure the browser's proxy.Настройте SOLVETHREE_API_KEY, CAPTCHA_SITE и SOLVETHREE_PROXY на сервере. CAPTCHA_SITE — имя целевого хоста, а не полный URL. Вспомогательная функция фиксирует действие login и задает один прокси; браузер не выбирает ни один из этих параметров.
Перед вызовом вспомогательной функции настройте в рабочем пространстве активный профиль для этого имени хоста. Передача site и action не создает профиль. См. настройку профиля сайта.
waitMs: 0 запрашивает создание задачи без ожидания завершения решения. Сохраните возвращенный ID задачи и получайте ее из серверного кода с помощью getTask. Сигнал отмены через 20 секунд ограничивает длительность этого запроса, но не гарантирует, что решение завершится за 20 секунд.
Предоставляйте операцию входа, а не произвольное решение CAPTCHA
Сама по себе вспомогательная функция не является маршрутом с аутентификацией. Прежде чем принимать запросы браузера, добавьте вокруг нее следующие проверки:
| Операция | Что отправляет браузер | Что делает бэкенд |
|---|---|---|
| Запуск решения для входа | Сеанс приложения и requestId для этой попытки входа. | Аутентифицирует вызывающего клиента, проверяет попытку и лимиты создания, затем вызывает вспомогательную функцию с фиксированными параметрами. Сохраняет ID задачи с привязкой к этому клиенту и попытке; возвращает только ID задачи и статус, необходимые интерфейсу. |
| Получение прогресса | Сеанс приложения и ID задачи, возвращенный для этой попытки. | Перед получением задачи проверяет, что она принадлежит вызывающему клиенту. Возвращает прогресс, контролируемый ответ об ошибке или готовый результат, необходимый авторизованному клиенту, который выполняет отправку. |
Не пересылайте тело задачи, полученное от браузера. Отклоняйте попытки выбрать другое имя хоста, действие, прокси или тип задачи. Установите лимит создания для каждого клиента или сеанса приложения: даже аутентифицированный клиент может исчерпать баланс, создавая новые задачи. Если маршрут использует аутентификацию через cookie, защитите запросы создания задач от межсайтовой подделки запросов.
ID задачи не дает права доступа. Проверяйте принадлежность задачи при каждом запросе прогресса и не возвращайте учетные данные рабочего пространства или серверного прокси в ответах браузеру.
Восстановите существующую задачу перед созданием новой
- Сохраняйте один requestId для логической попытки входа. Проверяйте его документированный формат: 1–64 ASCII-буквы, цифры, символы подчеркивания или дефисы. Привяжите его к попытке вызывающего клиента; он не является учетными данными для аутентификации.
- Если время ожидания создания истекло, сохраните этот requestId и исходные входные данные задачи. Повтор того же запроса с тем же ID восстанавливает существующую задачу. Изменение входных данных при повторном использовании ID вызывает конфликт.
- Обрабатывайте неуспешные HTTP-ответы, прежде чем интерпретировать данные успешного ответа. Для полученной задачи статусы pending и solving означают, что нужно продолжать опрос; ready означает, что решение доступно.
Получив ID задачи, запрашивайте эту задачу, а не запускайте новое решение при каждом обновлении страницы браузера или запросе прогресса. Для диагностики сбоев см. обработку ошибок API.
Определите, какой клиент будет отправлять токен
Прежде чем возвращать готовый токен браузеру, определите, где будет выполняться запрос к целевому сайту. Отправляющий клиент должен использовать возвращенные идентификационные данные userAgent и secChUa, а также прокси, с которым решение завершилось успешно. Перенос ключа рабочего пространства на бэкенд не настраивает прокси браузера.
Если браузер не может выполнить отправку с этими настройками, передача ему одного токена не является полноценной интеграцией. Используйте отправляющий клиент, который можно согласованно настроить, не подмешивая идентификационные данные, прокси или целевой URL из другого сеанса. Готовая задача означает, что solvethree сгенерировал решение, а не что целевой сайт принял последующий запрос.
Источники и справочник API
Запустите первую задачу.
Начните с $5 на балансе рабочего пространства.