recaptcha
recaptcha 中间件为 Flame 实例提供 Google reCAPTCHA在新窗口打开 验证服务的集成。
你可以在 GitHub在新窗口打开 上阅读该中间件的源码或通过 pkg.go.dev在新窗口打开 查看 API 文档。
下载安装
Go 语言的最低版本要求为 1.16。
go get github.com/flamego/recaptcha
用法示例
注意
本小结仅展示 recaptcha 中间件的相关用法,示例中的用户验证方案绝不可以直接被用于生产环境。
reCAPTCHA v3
recaptcha.V3
在新窗口打开 可以配合 recaptcha.Options
在新窗口打开 用于集成 reCAPTCHA v3在新窗口打开,并使用 recaptcha.RecaptchaV3.Verify
来进行验证码的校验:
- main.go
- templates/home.tmpl
package main
import (
"fmt"
"net/http"
"github.com/flamego/flamego"
"github.com/flamego/recaptcha"
"github.com/flamego/template"
)
func main() {
f := flamego.Classic()
f.Use(template.Templater())
f.Use(recaptcha.V3(
recaptcha.Options{
Secret: "<SECRET>",
VerifyURL: recaptcha.VerifyURLGoogle,
},
))
f.Get("/", func(t template.Template, data template.Data) {
data["SiteKey"] = "<SITE KEY>"
t.HTML(http.StatusOK, "home")
})
f.Post("/", func(w http.ResponseWriter, r *http.Request, re recaptcha.RecaptchaV3) {
token := r.PostFormValue("g-recaptcha-response")
resp, err := re.Verify(token)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(err.Error()))
return
} else if !resp.Success {
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(fmt.Sprintf("Verification failed, error codes %v", resp.ErrorCodes)))
return
}
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("Verified!"))
})
f.Run()
}
<html>
<head>
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<body>
<script>
function onSubmit(token) {
document.getElementById("demo-form").submit();
}
</script>
<form id="demo-form" method="POST">
<button class="g-recaptcha"
data-sitekey="{{.SiteKey}}"
data-callback='onSubmit'
data-action='submit'>Submit</button>
</form>
</body>
</html>
因为 reCAPTCHA v3 采用非侵入式的校验方式,所以不会在网页中看到任何验证码。
reCAPTCHA v2
recaptcha.V2
在新窗口打开 可以配合 recaptcha.Options
在新窗口打开 用于集成 reCAPTCHA v2在新窗口打开,并使用 recaptcha.RecaptchaV2.Verify
来进行验证码的校验。
下面的例子才采用了 “I’m not a robot” Checkbox 类型的校验形式:
- main.go
- templates/home.tmpl
package main
import (
"fmt"
"net/http"
"github.com/flamego/flamego"
"github.com/flamego/recaptcha"
"github.com/flamego/template"
)
func main() {
f := flamego.Classic()
f.Use(template.Templater())
f.Use(recaptcha.V2(
recaptcha.Options{
Secret: "<SECRET>",
VerifyURL: recaptcha.VerifyURLGoogle,
},
))
f.Get("/", func(t template.Template, data template.Data) {
data["SiteKey"] = "<SITE KEY>"
t.HTML(http.StatusOK, "home")
})
f.Post("/", func(w http.ResponseWriter, r *http.Request, re recaptcha.RecaptchaV2) {
token := r.PostFormValue("g-recaptcha-response")
resp, err := re.Verify(token)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(err.Error()))
return
} else if !resp.Success {
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(fmt.Sprintf("Verification failed, error codes %v", resp.ErrorCodes)))
return
}
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("Verified!"))
})
f.Run()
}
<html>
<head>
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<body>
<form method="POST">
<div class="g-recaptcha" data-sitekey="{{.SiteKey}}"></div>
<input type="submit" name="button" value="Submit">
</form>
</body>
</html>
下图为程序运行时浏览器中所展示的内容: