auth.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package router
  2. import (
  3. "errors"
  4. "sync/atomic"
  5. "github.com/go-playground/validator/v10"
  6. "github.com/gorilla/websocket"
  7. jsoniter "github.com/json-iterator/go"
  8. "github.com/sirupsen/logrus"
  9. "gogs.daxia.dev/huanan/pkg.daxia.dev/validate_utils"
  10. "nn.daxia.dev/model"
  11. )
  12. var validate = validator.New()
  13. var uniqueIndex = int64(1)
  14. type HandleFunc func(*websocket.Conn, []byte, map[string]interface{}) error
  15. // 校验登录信息
  16. func GameAuthMiddleware(conn *websocket.Conn, message []byte, handleFunc HandleFunc) (map[string]interface{}, error) {
  17. type GameAuth struct {
  18. Token string `json:"token" validate:"required"`
  19. Once string `json:"once" validate:"required"`
  20. }
  21. ctx := map[string]interface{}{
  22. "userModel": nil,
  23. }
  24. err := func() error {
  25. gameAuth := GameAuth{}
  26. err := jsoniter.Unmarshal(message, &gameAuth)
  27. if err != nil {
  28. return err
  29. }
  30. err = validate.Struct(&gameAuth)
  31. if err != nil {
  32. errStr := validate_utils.SetErrorStr(err, func(tag string) string {
  33. switch tag {
  34. case "Token.required":
  35. return "Token不能为空"
  36. }
  37. return "内部错误"
  38. })
  39. return errors.New(errStr(0))
  40. }
  41. userToken := gameAuth.Token
  42. userModel := model.User{}
  43. var valid bool
  44. if valid, err = userModel.TokenIsValid(userToken); err != nil {
  45. logrus.Error(err)
  46. return errors.New("internel error")
  47. }
  48. if !valid {
  49. logrus.Errorf("权限检测不通过:%d, err:%v", userModel.ID, err)
  50. return errors.New("internel error")
  51. }
  52. ctx["userModel"] = userModel
  53. ctx["once"] = gameAuth.Once
  54. ctx["unique_index"] = atomic.AddInt64(&uniqueIndex, 1)
  55. logrus.Infof("权限检测通过, userID:%d", userModel.ID)
  56. return nil
  57. }()
  58. if err != nil {
  59. logrus.Errorf("check auth error:%v", err)
  60. conn.Close()
  61. return nil, err
  62. }
  63. userModel := ctx["userModel"].(model.User)
  64. logrus.Infof("finish auth: %d, handle func:%v", userModel.ID, handleFunc)
  65. return ctx, handleFunc(conn, message, ctx)
  66. }