@mezzanine-stack/captcha-turnstile
v0.1.0
Published
[Cloudflare Turnstile](https://developers.cloudflare.com/turnstile/) を使う `CaptchaAdapter` の実装。`@mezzanine-stack/contact-core` の `CaptchaAdapter` contract を満たします。
Readme
@mezzanine-stack/captcha-turnstile
Cloudflare Turnstile を使う CaptchaAdapter の実装。@mezzanine-stack/contact-core の CaptchaAdapter contract を満たします。
使い方
import { TurnstileCaptchaAdapter } from "@mezzanine-stack/captcha-turnstile";
const captcha = new TurnstileCaptchaAdapter({ secretKey: env.TURNSTILE_SECRET_KEY });
const result = await captcha.verify(token, ip);
if (!result.ok) {
console.error("Captcha failed:", result.reason);
}フォームのフィールド名
Turnstile ウィジェットは cf-turnstile-response という名前でトークンを送信します。HTML フォームの場合:
<div class="cf-turnstile" data-sitekey="YOUR_SITE_KEY"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>contact-service-cloudflare は cf-turnstile-response フィールドを自動で読み取ります。
戻り値 (CaptchaResult)
| フィールド | 型 | 説明 |
|---|---|---|
| ok | boolean | 検証成功の可否 |
| reason | string? | Turnstile error-codes の最初の値 |
よくある error-codes
| コード | 説明 |
|---|---|
| missing-input-response | トークンが空 |
| invalid-input-response | トークンが無効または期限切れ |
| timeout-or-duplicate | タイムアウトまたは重複検証 |
環境変数
| 変数名 | 必須 | 説明 |
|---|---|---|
| TURNSTILE_SECRET_KEY | ✓ | Turnstile シークレットキー。Wrangler secret で設定。 |
