前言

在網站應用中,表單或登入功能常常成為機器人攻擊的目標。 Google reCAPTCHA Enterprise 提供了更安全且彈性的防護方式,能透過 風險評分 (Score) 來判斷使用者行為是否可信。

本篇會示範如何從零開始設定並串接 reCAPTCHA Enterprise,包含 GCP 設定、前端整合、後端驗證

主要內容

前置準備

建立 reCAPTCHA Key

  1. 進入 Google Cloud Console

  2. 啟用 reCAPTCHA Enterprise API

  3. 建立 Site Key,需要設定:

    • 網域(允許的前端來源)
    • 驗證模式(建議使用 Score-based
  4. 記下以下資訊:

    • Site Key(前端需要)
    • Project ID(後端呼叫 API 使用)
  5. 建立 Service Account

    • 前往 IAM & Admin → Service Accounts
    • 建立新帳號,角色選擇 reCAPTCHA Enterprise Admin 或 Editor
    • 建立完成後,下載 JSON 憑證檔,命名為 service-account.json

前端:取得 Token

在網頁上載入 enterprise.js,呼叫 execute() 取得 token。

 1<script src="https://www.google.com/recaptcha/enterprise.js?render=your_site_key"></script>
 2<script>
 3  function onSubmit(e) {
 4    e.preventDefault();
 5
 6    grecaptcha.enterprise.ready(async () => {
 7      const token = await grecaptcha.enterprise.execute('your_site_key', { action: 'login' });
 8
 9      // 傳送 token 到後端
10      const resp = await fetch('/verify-recaptcha', {
11        method: 'POST',
12        headers: { 'Content-Type': 'application/json' },
13        body: JSON.stringify({ token })
14      });
15
16      const result = await resp.json();
17      if (result.success && result.score >= 0.5) {
18        alert("驗證通過,可以登入");
19      } else {
20        alert("驗證失敗,請再試一次");
21      }
22    });
23  }
24</script>
25
26<form onsubmit="onSubmit(event)">
27  <input type="text" name="username" placeholder="帳號">
28  <input type="password" name="password" placeholder="密碼">
29  <button type="submit">登入</button>
30</form>

這裡 action: 'login' 是自訂的標籤,方便後端追蹤不同的驗證情境。

後端:驗證 Token (Go 範例)

使用官方 Go SDK cloud.google.com/go/recaptchaenterprise/v2,建立 Assessment 驗證 token。

 1package main
 2
 3import (
 4    "context"
 5    "encoding/json"
 6    "fmt"
 7    "log"
 8    "net/http"
 9    "os"
10
11    recaptcha "cloud.google.com/go/recaptchaenterprise/v2/apiv1"
12    recaptchapb "cloud.google.com/go/recaptchaenterprise/v2/apiv1/recaptchaenterprisepb"
13    "google.golang.org/api/option"
14)
15
16type VerifyRequest struct {
17    Token string `json:"token"`
18}
19type VerifyResponse struct {
20    Success bool    `json:"success"`
21    Score   float32 `json:"score"`
22}
23
24func verifyRecaptchaHandler(w http.ResponseWriter, r *http.Request) {
25    var req VerifyRequest
26    _ = json.NewDecoder(r.Body).Decode(&req)
27
28    ctx := context.Background()
29    client, _ := recaptcha.NewClient(ctx, option.WithCredentialsFile("service-account.json"))
30    defer client.Close()
31
32    projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
33
34    assessment, err := client.CreateAssessment(ctx, &recaptchapb.CreateAssessmentRequest{
35        Parent: fmt.Sprintf("projects/%s", projectID),
36        Assessment: &recaptchapb.Assessment{
37            Event: &recaptchapb.Event{
38                Token:   req.Token,
39                SiteKey: "your_site_key",
40            },
41        },
42    })
43    if err != nil {
44        http.Error(w, err.Error(), http.StatusInternalServerError)
45        return
46    }
47
48    resp := VerifyResponse{
49        Success: assessment.TokenProperties.Valid,
50        Score:   assessment.RiskAnalysis.Score,
51    }
52
53    w.Header().Set("Content-Type", "application/json")
54    json.NewEncoder(w).Encode(resp)
55}
56
57func main() {
58    http.HandleFunc("/verify-recaptcha", verifyRecaptchaHandler)
59    log.Println("Server started on :8080")
60    http.ListenAndServe(":8080", nil)
61}

需要準備:

  • Service Account JSON 憑證 (service-account.json)
  • 環境變數 GOOGLE_CLOUD_PROJECT 設定為 GCP 專案 ID

驗證邏輯

  • Success = true → token 有效

  • Score 越高越可能是真人

  • 建議策略:

    • 登入、金流相關操作:score >= 0.5
    • 一般留言或表單:可適度放寬
    • score < 0.3 時可要求額外驗證(例如簡訊或 Email 驗證)

小結

完整流程如下:

  1. 建立 reCAPTCHA Key
  2. 前端呼叫 grecaptcha.enterprise.execute() 拿到 token
  3. 後端透過 CreateAssessment 驗證 token
  4. 根據 ValidScore 判斷是否放行

這樣就完成了 reCAPTCHA Enterprise 的基本串接,可以有效防護網站免受機器人攻擊。

參考連結