不要将 CAPTCHA API 密钥放入浏览器 JavaScript
将 solvethree 工作区 API 密钥保留在服务器上。浏览器负责表单和应用会话;经过身份验证的后端负责任务创建和查询。不要为了替换已在浏览器中泄露的密钥,就提供一个任何人都能用来消耗工作区余额的不受限制的后端接口。
本页内容
不要将工作区密钥放在 NEXT_PUBLIC 中
工作区密钥通过 Authorization: Bearer 对发送到 solvethree 的请求进行身份验证。将其放入浏览器 JavaScript 中,包括通过 NEXT_PUBLIC_SOLVETHREE_API_KEY 等打包的公开环境变量传入,都会向浏览器暴露该凭据。混淆密钥值或仅在直接发起 fetch 请求时添加它,都无法使其保密。
将 SOLVETHREE_API_KEY 保存在仅限服务端使用的配置中,并且仅在可信的服务端代码中使用。浏览器应调用你的应用接口,绝不能携带工作区密钥调用 solvethree 任务 API。
将任务输入保留在仅限服务端使用的辅助函数中
// 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 秒内完成。
提供登录操作,而不是通用求解接口
辅助函数本身并不是经过身份验证的接口。在接受浏览器请求之前,请在其外围添加以下检查:
| 操作 | 浏览器发送的内容 | 后端执行的操作 |
|---|---|---|
| 启动登录求解 | 应用会话和本次登录尝试的 requestId。 | 验证调用方身份和本次尝试,检查任务创建限制,然后调用输入固定的辅助函数。将任务 ID 与调用方及本次尝试关联保存;仅返回 UI 所需的任务 ID 和状态。 |
| 查询进度 | 应用会话和为本次尝试返回的任务 ID。 | 查询任务前,检查任务是否属于该调用方。返回进度、受控的失败响应,或已获授权的提交客户端所需的就绪结果。 |
不要转发浏览器提供的任务正文。拒绝任何选择其他主机名、操作、代理或任务类型的尝试。按调用方或应用会话设置创建限制:即使调用方已通过身份验证,也仍可能通过不断创建新任务耗尽余额。如果接口使用 Cookie 身份验证,请保护任务创建请求,防止跨站请求伪造。
任务 ID 不代表授权。每次请求进度时都要检查归属,并且不要在浏览器响应中返回工作区凭据或服务端代理凭据。
创建新任务前,先恢复现有任务
- 为同一次逻辑登录尝试保留一个 requestId。按文档要求验证其格式:1–64 个 ASCII 字母、数字、下划线或连字符。将其绑定到调用方的本次尝试;它不是身份验证凭据。
- 如果创建超时,请保留该 requestId 和原始任务输入。使用同一 ID 重复发送相同请求可恢复现有任务。复用该 ID 时更改输入会产生冲突。
- 在解析成功响应内容之前,先处理非成功的 HTTP 响应。对于查询到的任务,pending 和 solving 表示应继续轮询;ready 表示解决方案已可用。
获得任务 ID 后,应查询该任务,而不是在每次浏览器刷新或进度请求时重新启动求解。有关故障诊断,请参阅 API 错误处理。
确定由哪个客户端提交令牌
将就绪的令牌返回浏览器之前,先确定在哪里执行目标请求。提交客户端必须使用返回的 userAgent 和 secChUa 身份,以及本次求解成功时使用的代理。将工作区密钥移到后端并不会配置浏览器的代理。
如果浏览器无法使用这些设置提交,仅将令牌交给它并不算完整的集成。请使用能够保持配置一致的提交客户端,不要混用其他会话的身份、代理或目标 URL。任务就绪表示 solvethree 已生成解决方案,并不表示目标已接受后续请求。
运行您的第一个任务。
使用 $5 工作区额度开始体验。