コンテンツにスキップ

14-3 通行証を本社で確かめる(siteverify)

Plan: Free費用: 0円Wrangler 4.126.0公式ドキュメント取得日 2026-08-27
係が渡した通行証は、本社に問い合わせて本物か確かめます。

入口の係が「大丈夫」と判断すると、お客さんに小さな通行証を渡します。お客さんは申込書とその通行証を事務所へ出します。

ここで通行証を見るだけなら、よく似たものを自分で作った相手を止められません。本物かは、発行元の本社に聞くしかありません。

いま読んでいるこのサイト(Cloudflare Lab)でも、書き込みを受けるのは Worker です。本社に問い合わせる手順を、その中に書くことになります。

Learning goals

この節でできるようになること

  • token の有効期間と回数を言える
  • Siteverify API へ何を送るかを言える
  • success と error-codes の読み方を言える
  • 確かめないと何が起きるかを言える

入口でもらう通行証は、一度使ったらそれきりです。長く使える通行証は、写しを作られると危険です。

Cloudflare では、この通行証を token と呼びます。公式は、token の長さが最大 2,048 文字、有効期間が発行から 300 秒(5 分)で、1 回しか検証できないと明記しています。

使い回した token は、公式の言うとおり timeout-or-duplicate という error code で拒否されます。5 分を過ぎた場合も同じ code です。

通行証は五分で切れ、使えるのは一回だけです。

通行証には砂時計が付いていて、5 分で砂が落ち切ります。

つまり、通行証は 5 分で切れ、使えるのは 1 回だけです。

事務所が本社へ聞くときは、通行証と一緒に合鍵も送ります。合鍵は、その事務所が本物だという証しです。

Cloudflare では、問い合わせ先が Siteverify API です。公式は、https://challenges.cloudflare.com/turnstile/v0/siteverify へ POST で送ると示しています。必須の項目は 2 つで、secret(widget の secret key)と response(widget が作った token)です。

任意の項目は remoteip(訪問者の IP アドレス)と idempotency_key(再送を安全にする UUID)です。送り方は form でも JSON でもよく、返事はいつも JSON です。

次の命令は「合鍵と通行証を本社へ送る」ものです。読めなくても大丈夫です。

const body = new FormData();
body.append("secret", SECRET_KEY);
body.append("response", token);
const res = await fetch(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
{ method: "POST", body },
);
const result = await res.json();

実行すると、本物かどうかを書いた JSON が返ります。

合鍵と通行証を本社へ送ると、本物かどうかが返ってきます。

合鍵と通行証をそろえて本社へ送り、返事を待ちます。

つまり、確認は「secret と response を Siteverify API へ送る」だけです。

本社からの返事は、まず可否が 1 行あり、駄目なときは理由が付きます。

公式は、返事の項目として success(成功したか)、challenge_ts(解かれた時刻)、hostname(出された店名)、error-codes(失敗の理由)などを挙げています。まず読むのは success です。

error-codes の意味も表にあります。invalid-input-response は token が不正か期限切れ、timeout-or-duplicate は同じ token の二度目です。

返事にはまず可否があり、駄目なときは理由が並びます。

返事の紙は、上に可否、下に理由の欄があります。

つまり、success で通し、error-codes で原因をたどります。

通行証を見た「ふり」で通していると、係を置いた意味がなくなります。それは外から分かりません。

公式は、サーバー側での検証が必須だと書いています。理由は 3 つで、token は偽造できる、期限切れになる、1 回しか使えない、です。

公式は、Siteverify API を呼ぶのは backend だけにするよう求めています。secret key を画面側に出すと、確認そのものを迂回されます。

本社に確かめないと、偽の通行証がそのまま通ります。

通行証を見ずに通している事務所の横を、機械がそのまま通り抜けています。

つまり、Siteverify API を呼ばない限り、係を置いても守れていません。

ここで紹介した確認が、いま読んでいる Cloudflare Lab でどう使われるかを見ます。

Cloudflare Lab の書き込みの入口は Worker になる予定です。届いた token を Worker の中で Siteverify API へ送り、success が真のときだけ受け付けます。実測は後で追記します。

  • token は最大 2,048 文字、300 秒(5 分)有効の 1 回きりです。
  • 確認は secret と response を Siteverify API へ送るだけです。
  • 返事は success で判断し、駄目なときは error-codes を読みます。

この節で出てきた言葉を、つながりの順に並べると次のようになります。

図のラベル: 係が渡す通行証 token(5 分・1 回) / サーバー側に届く / 合鍵を添えて送る secret と response / 本社の窓口 Siteverify API / 可否を読む success / 駄目な理由を読む error-codes / 二度使うと失敗 timeout-or-duplicate

次の節では、この係を店のどこに置くかを考えます。

この節のチェック

問 1token の有効期間として公式が示している値はどれですか?

問 2同じ token を二度検証するとどうなりますか?

問 3Siteverify API に必ず送る項目はどれですか?

問 4Siteverify API の返事で、まず読むべき項目はどれですか?

問 5Siteverify API を呼ぶ場所として公式が求めているのはどこですか?

最終更新日: