前言
GoogleRecaptcha学习笔记
获取密钥


用于测试的密钥对
网站密钥:6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
密钥:6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
前端验证(v3)
google域名:https://www.google.com/recaptcha/api.js
recaptcha域名:https://www.recaptcha.net/recaptcha/api.js
1 2 3 4 5 6 7 8 9
| <script src="https://www.recaptcha.net/recaptcha/api.js"></script> <script> function onSubmit(token) { console.log(token); ... } </script> <button class="g-recaptcha" data-sitekey="6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI" data-callback="onSubmit" data-action="submit">提交</button>
|
- 把从Cloudflare获取token发送请求给后端
request1 2 3 4
| POST http://127.0.0.1:8080/api Content-Type: application/json
{username: "", password: "", token: "从Google获取的token"}
|
后端验证
- 发送请求给Cloudflare验证从前端获取的token
google域名:https://www.google.com/recaptcha/api/siteverify
recaptcha域名:https://www.recaptcha.net/recaptcha/api/siteverify
request1 2 3 4
| POST https://www.recaptcha.net/recaptcha/api/siteverify Content-Type: application/x-www-form-urlencoded
secret=密钥&response=从前端获取的token
|
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| package main
import ( "encoding/json" "fmt" "io/ioutil" "net/http" "strings" "time" )
type GoogleRecaptchaVerificationResponseEntity struct { Success bool `json:"success"` Score uint `json:"score"` Action string `json:"action"` ChallengeTS time.Time `json:"challenge_ts"` ErrorCodes []string `json:"error-codes"` }
func GoogleRecaptchaVerification(token string) (err error, success bool) {
var url = "https://challenges.cloudflare.com/turnstile/v0/siteverify" var secret = "密钥" var requestPayload string = fmt.Sprintf("secret=%s&response=%s", secret, token) var responseEntity *http.Response if res, err := http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(requestPayload)); err != nil { return err, success } else { responseEntity = res } defer responseEntity.Body.Close() var responseText []byte if res, err := ioutil.ReadAll(responseEntity.Body); err != nil { return err, success } else { responseText = res } var responseObject GoogleRecaptchaVerificationResponseEntity if err := json.Unmarshal(responseText, &responseObject); err != nil { return err, success } if responseObject.Success == false { var errorCodeListString strings.Builder errorCodeListString.WriteString("\nErrorCodes:\n") for _, errorCodes := range responseObject.ErrorCodes { errorCodeListString.WriteString(errorCodes) } return err, false }
return err, true }
|
完成
参考文献
祥&宇的博客
哔哩哔哩——程序员老涂