使用 Go 串接 Google reCAPTCHA Enterprise
前言
在網站應用中,表單或登入功能常常成為機器人攻擊的目標。 Google reCAPTCHA Enterprise 提供了更安全且彈性的防護方式,能透過 風險評分 (Score) 來判斷使用者行為是否可信。
本篇會示範如何從零開始設定並串接 reCAPTCHA Enterprise,包含 GCP 設定、前端整合、後端驗證。
主要內容
前置準備
建立 reCAPTCHA Key
啟用 reCAPTCHA Enterprise API
建立 Site Key,需要設定:
- 網域(允許的前端來源)
- 驗證模式(建議使用 Score-based)
記下以下資訊:
- Site Key(前端需要)
- Project ID(後端呼叫 API 使用)
建立 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 驗證)
- 登入、金流相關操作:
小結
完整流程如下:
- 建立 reCAPTCHA Key
- 前端呼叫
grecaptcha.enterprise.execute()
拿到 token - 後端透過
CreateAssessment
驗證 token - 根據
Valid
與Score
判斷是否放行
這樣就完成了 reCAPTCHA Enterprise 的基本串接,可以有效防護網站免受機器人攻擊。