CAPTCHA APIキーをブラウザのJavaScriptに含めない
solvethree のワークスペース API キーはサーバーで保持してください。フォームとアプリケーションセッションはブラウザーが管理し、タスクの作成と取得は認証で保護されたバックエンドが管理します。ブラウザーで漏えいしたキーの代わりに、誰でもワークスペース残高を消費できる無制限のバックエンドルートを設けないでください。
このページの内容
ワークスペースキーを NEXT_PUBLIC に置かない
ワークスペースキーは、Authorization: Bearer を使用して solvethree へのリクエストを認証します。NEXT_PUBLIC_SOLVETHREE_API_KEY のようなバンドルに含まれる公開環境変数を経由する場合も含め、ブラウザーの JavaScript にキーを埋め込むと、その認証情報がブラウザーに公開されます。値を難読化したり、直接 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 に固定し、プロキシを1つ指定します。これらの入力値をブラウザーが選択することはありません。
ヘルパーを呼び出す前に、ワークスペースでそのホスト名の有効なプロファイルを設定してください。site と action を送信してもプロファイルは作成されません。サイトプロファイルの設定を参照してください。
waitMs: 0 は、解答生成の完了を待たずに作成をリクエストします。返されたタスク ID を保存し、サーバーコードから getTask で取得してください。ヘルパーの20秒の中断シグナルは、そのリクエストの実行時間を制限するものであり、20秒以内に解答生成が完了するという保証ではありません。
任意の解答生成機能ではなく、ログイン操作を公開する
ヘルパー自体は認証付きルートではありません。ブラウザーからのリクエストを受け付ける前に、その周囲に次のチェックを実装してください。
| 操作 | ブラウザーが送信する内容 | バックエンドの処理 |
|---|---|---|
| ログイン用の解答生成を開始 | アプリケーションセッションと、このログイン試行の requestId。 | 呼び出し元を認証し、試行の妥当性と作成上限を確認して、入力値を固定したヘルパーを呼び出します。タスク ID を呼び出し元と試行に紐付けて保存し、UI に必要なタスク ID とステータスだけを返します。 |
| 進捗を取得 | アプリケーションセッションと、その試行で返されたタスク ID。 | 取得前にタスクが呼び出し元に属することを確認します。進捗、公開内容を制御した失敗レスポンス、または送信権限を持つクライアントに必要な生成済みの結果を返します。 |
ブラウザーから渡されたタスク本文を転送しないでください。別のホスト名、アクション、プロキシ、タスクタイプを選択しようとするリクエストは拒否してください。呼び出し元またはアプリケーションセッションごとに作成上限を設けてください。認証済みの呼び出し元でも、新しいタスクを作成し続けることでクレジットを使い切る可能性があります。ルートで Cookie 認証を使用する場合は、タスク作成リクエストをクロスサイトリクエストフォージェリから保護してください。
タスク ID は認可の代わりにはなりません。進捗リクエストのたびに所有者を確認し、ブラウザーへのレスポンスにワークスペース認証情報やサーバーのプロキシ認証情報を含めないでください。
別のタスクを作成する前に既存のタスクを復旧する
- 同じ論理的なログイン試行には、1つの requestId を使い続けてください。ドキュメントに記載された形式、つまり1–64文字の ASCII 英数字、アンダースコア、ハイフンであることを検証してください。呼び出し元の試行に紐付けてください。これは認証情報ではありません。
- 作成がタイムアウトした場合は、その requestId と元のタスク入力値を保持してください。同じ ID で同じリクエストを繰り返すと、既存のタスクを復旧できます。同じ ID を再利用しながら入力値を変更すると、競合が発生します。
- 成功時のペイロードとして解釈する前に、成功以外の HTTP レスポンスを処理してください。取得したタスクが pending または solving ならポーリングを続け、ready なら解答を利用できます。
タスク ID を取得した後は、ブラウザーの更新や進捗リクエストのたびに新しく解答生成を開始せず、そのタスクを取得してください。失敗の原因調査については、API エラー処理を参照してください。
トークンを送信するクライアントを決める
生成済みのトークンをブラウザーに返す前に、対象サイトへのリクエストをどこで実行するかを決めてください。送信するクライアントは、返された userAgent と secChUa の識別情報、およびその解答生成で成功したプロキシを使用する必要があります。ワークスペースキーをバックエンドに移しても、ブラウザーのプロキシは設定されません。
ブラウザーがこれらの設定で送信できない場合、トークンだけを渡しても統合は完成しません。別のセッションの識別情報、プロキシ、対象 URL を混在させず、一貫した設定が可能な送信クライアントを使用してください。タスクが ready であることは、solvethree が解答を生成したことを意味し、対象サイトがその後のリクエストを受け入れたことを意味するわけではありません。
最初のタスクを実行しましょう。
$5のワークスペースクレジットで始められます。