1
0

turnstile-check.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package middleware
  2. import (
  3. "encoding/json"
  4. "github.com/gin-contrib/sessions"
  5. "github.com/gin-gonic/gin"
  6. "message-pusher/common"
  7. "net/http"
  8. "net/url"
  9. )
  10. type turnstileCheckResponse struct {
  11. Success bool `json:"success"`
  12. }
  13. func TurnstileCheck() gin.HandlerFunc {
  14. return func(c *gin.Context) {
  15. if common.TurnstileCheckEnabled {
  16. session := sessions.Default(c)
  17. turnstileChecked := session.Get("turnstile")
  18. if turnstileChecked != nil {
  19. c.Next()
  20. return
  21. }
  22. response := c.Query("turnstile")
  23. if response == "" {
  24. c.JSON(http.StatusOK, gin.H{
  25. "success": false,
  26. "message": "Turnstile token 为空",
  27. })
  28. c.Abort()
  29. return
  30. }
  31. rawRes, err := http.PostForm("https://challenges.cloudflare.com/turnstile/v0/siteverify", url.Values{
  32. "secret": {common.TurnstileSecretKey},
  33. "response": {response},
  34. "remoteip": {c.ClientIP()},
  35. })
  36. if err != nil {
  37. common.SysError(err.Error())
  38. c.JSON(http.StatusOK, gin.H{
  39. "success": false,
  40. "message": err.Error(),
  41. })
  42. c.Abort()
  43. return
  44. }
  45. defer rawRes.Body.Close()
  46. var res turnstileCheckResponse
  47. err = json.NewDecoder(rawRes.Body).Decode(&res)
  48. if err != nil {
  49. common.SysError(err.Error())
  50. c.JSON(http.StatusOK, gin.H{
  51. "success": false,
  52. "message": err.Error(),
  53. })
  54. c.Abort()
  55. return
  56. }
  57. if !res.Success {
  58. c.JSON(http.StatusOK, gin.H{
  59. "success": false,
  60. "message": "Turnstile 校验失败,请刷新重试!",
  61. })
  62. c.Abort()
  63. return
  64. }
  65. session.Set("turnstile", true)
  66. err = session.Save()
  67. if err != nil {
  68. c.JSON(http.StatusOK, gin.H{
  69. "message": "无法保存会话信息,请重试",
  70. "success": false,
  71. })
  72. return
  73. }
  74. }
  75. c.Next()
  76. }
  77. }