網頁後台改用 Cloudflare Turnstile 取代 Google reCAPTCHA。瀏覽器向 Cloudflare 拿到一次性的驗證 token,連同表單送給 SayDou 後端,後端再拿 token 回頭問 Cloudflare「這是真人嗎」。這頁用實際的程式位置,一步步拆開這個流程。
點卡片會切換到下方對應的流程圖。
四條泳道分別是使用者的瀏覽器、瀏覽器裡的 Cloudflare 驗證元件、SayDou 後端,以及 Cloudflare 的驗證 API。點圖上的任一步,或用下方按鈕逐步前進。
專案沒有安裝任何 Cloudflare 套件。loadTurnstileScript() 在需要時往 <head> 插入一支 script,整個網站只插一次;之後由 turnstile.render() 在指定的空容器裡建立驗證元件。切換下方三種情況,看畫面和 DOM 的變化。
environment.*.ts 的 turnstileSiteKeyinteraction-only:只有需要人工確認時才顯示勾選框zh-tw瀏覽器送來的 token 本身不代表通過,後端一定要拿 Secret Key 去問 Cloudflare。所有驗證都集中在 TurnstileService::verify(),逾時設 10 秒。切換下方情況,看 Cloudflare 的回覆和後端的判斷。
計數單位是「同一店家+同一 IP」,同店家同地點換帳號仍合併計算,連鎖店不同分店各自計算。鎖定也是以「店家+IP」為單位,一間分店被鎖不會影響其他分店。拉動次數、切換條件,看後端會怎麼回應。數值為目前的預設設定。
後端設定在 .env,修改後執行 php artisan config:clear(正式機再加 config:cache),不用改程式。Secret Key 只放後端,不寫進任何文件。
| 設定 | 預設 | 作用 |
|---|---|---|
| 開關 | ||
| TURNSTILE_LOGIN_ENABLED | false | 網頁登入是否驗證。前端新版上線後才開,否則舊頁面無法登入 |
| TURNSTILE_ENABLED | false | 查詢超量驗證的總開關 |
| TURNSTILE_OBSERVE_ONLY | false | 觀察模式:超量只寫 log、不要求驗證 |
| 連線 | ||
| TURNSTILE_SECRET | — | Cloudflare 的 Secret Key,只放後端 |
| TURNSTILE_ALLOWED_HOSTNAMES | (空) | Cloudflare 回覆的網域必須在清單內,逗號分隔 |
| 查詢超量規則 | ||
| TURNSTILE_SOFT_LIMIT | 100 | 一般店家:同店家+同 IP,計數區間內超過幾次要驗證 |
| TURNSTILE_SOFT_WINDOW_MINUTES | 10 | 計數區間(分鐘),從第一次查詢起算 |
| TURNSTILE_LOCK_MINUTES | 10 | 一般店家超過門檻後,沒通過驗證要等多久;持續打也不延長 |
| TURNSTILE_STRICT_CUSTIDS | (空) | 異常店家名單,逗號分隔 |
| TURNSTILE_STRICT_SOFT_LIMIT | 20 | 異常店家的門檻 |
| TURNSTILE_STRICT_LOCK_MINUTES | 30 | 異常店家超過門檻後,沒通過驗證要等多久 |
| TURNSTILE_CLEARANCE_TTL_MINUTES | 10 | 通過驗證後通行的有效時間 |
| TURNSTILE_CLEARANCE_MAX_REQUESTS | 60 | 通行期間最多再放行幾次,用完要再驗證 |
| 前端 | ||
| environment.*.ts → turnstileSiteKey | 測試 key | 正式、staging 各一個 Site Key(公開值);本機開發用 Cloudflare 官方測試 key |