base_auth.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "eta/eta_mini_api/models"
  5. "eta/eta_mini_api/utils"
  6. "net/http"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/beego/beego/v2/client/orm"
  11. "github.com/beego/beego/v2/server/web"
  12. )
  13. type BaseAuthController struct {
  14. web.Controller
  15. User *models.User
  16. Session *models.WxSession
  17. }
  18. func (c *BaseAuthController) Prepare() {
  19. method := c.Ctx.Input.Method()
  20. // uri := c.Ctx.Input.URI()
  21. if method != "HEAD" {
  22. if method == "POST" || method == "GET" {
  23. authorization := c.Ctx.Input.Header("authorization")
  24. if authorization == "" {
  25. c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:Token is empty or account is empty"})
  26. c.StopRun()
  27. return
  28. }
  29. tokenStr := authorization
  30. tokenArr := strings.Split(tokenStr, "=")
  31. token := tokenArr[1]
  32. session, err := models.GetWxSessionByToken(token)
  33. if err != nil {
  34. if err == orm.ErrNoRows {
  35. c.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "Token 信息已变更:Token: " + token})
  36. c.StopRun()
  37. return
  38. }
  39. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()})
  40. c.StopRun()
  41. return
  42. }
  43. if session == nil {
  44. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "sesson is empty "})
  45. c.StopRun()
  46. return
  47. }
  48. if time.Now().After(session.ExpireTime) {
  49. c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新登录!", ErrMsg: "获取用户信息异常"})
  50. c.StopRun()
  51. return
  52. }
  53. var user *models.User
  54. if session.OpenId != "" {
  55. tmpWxUser, tmpErr := models.GetUserByOpenId(session.OpenId)
  56. user = tmpWxUser
  57. err = tmpErr
  58. } else if session.UserId > 0 {
  59. tmpWxUser, tmpErr := models.GetUserById(session.UserId)
  60. user = tmpWxUser
  61. err = tmpErr
  62. } else {
  63. c.JSON(models.BaseResponse{Ret: 408, Msg: "数据异常!", ErrMsg: "sesson is empty "})
  64. c.StopRun()
  65. return
  66. }
  67. if err != nil {
  68. if err == orm.ErrNoRows {
  69. c.JSON(models.BaseResponse{Ret: 408, Msg: "信息已变更,请重新登陆!", ErrMsg: "获取sysUser信息失败: " + strconv.Itoa(session.UserId)})
  70. c.StopRun()
  71. return
  72. }
  73. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "获取sysUser信息异常,Err:" + err.Error()})
  74. c.StopRun()
  75. return
  76. }
  77. if user == nil {
  78. c.JSON(models.BaseResponse{Ret: 408, Msg: "网络异常,请稍后重试!", ErrMsg: "sysUser is empty"})
  79. c.StopRun()
  80. return
  81. }
  82. c.User = user
  83. c.Session = session
  84. } else {
  85. c.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"})
  86. c.StopRun()
  87. return
  88. }
  89. }
  90. }
  91. func (c *BaseAuthController) JSON(data interface{}) error {
  92. c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
  93. desEncrypt := utils.DesBase64Encrypt([]byte(utils.DesKey), utils.DesKeySalt)
  94. c.Ctx.Output.Header("Dk", string(desEncrypt)) // des3加解密key
  95. // 设置Cookie为HTTPOnly
  96. c.Ctx.SetCookie("", "", -1, "/", "", false, true, "")
  97. content, err := json.Marshal(data)
  98. if err != nil {
  99. http.Error(c.Ctx.Output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
  100. return err
  101. }
  102. if utils.RunMode != "debug" {
  103. content = utils.DesBase64Encrypt(content, utils.DesKey)
  104. content = []byte(`"` + string(content) + `"`)
  105. }
  106. return c.Ctx.Output.Body(content)
  107. }