token.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package token
  2. import (
  3. "errors"
  4. "fmt"
  5. "mtp2_if/config"
  6. "mtp2_if/global/e"
  7. "mtp2_if/rediscli"
  8. "net/http"
  9. "runtime"
  10. "strings"
  11. "github.com/gin-gonic/gin"
  12. )
  13. // TouristToken 游客Token
  14. var TouristToken string = "c886a057f3d820d4dbc41473686c7c2d"
  15. // CheckToken Token校验
  16. func CheckToken(loginid string, token string, group string) error {
  17. key := ""
  18. if len(group) == 0 {
  19. key = fmt.Sprintf("monitor:online_loginid::%s", loginid)
  20. } else {
  21. key = fmt.Sprintf("monitor:online_loginid:%s:%s", loginid, group)
  22. }
  23. field := "Token"
  24. realToken, err := rediscli.GetRedisClient().HGet(key, field).Result()
  25. if err != nil {
  26. return err
  27. }
  28. if realToken != token {
  29. return errors.New("token is invalid")
  30. }
  31. return nil
  32. }
  33. // Auth Token校验中间件
  34. func Auth() gin.HandlerFunc {
  35. return func(c *gin.Context) {
  36. // if config.SerCfg.GetDebugMode() {
  37. // c.Next()
  38. // return
  39. // }
  40. if config.SerCfg.GetDebugMode() &&
  41. runtime.GOOS == "windows" {
  42. c.Next()
  43. return
  44. }
  45. var code int
  46. var data interface{}
  47. code = e.SUCCESS
  48. token := c.GetHeader("Authorization")
  49. if token == "" {
  50. // Token缺失
  51. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  52. } else {
  53. // 获取loginid
  54. s := strings.Split(token, "_")
  55. loginid := s[0]
  56. // 支持分组功能
  57. group := ""
  58. if len(s) == 3 {
  59. group = s[2]
  60. }
  61. if err := CheckToken(loginid, token, group); err != nil {
  62. // Token错误
  63. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  64. }
  65. }
  66. // Token检验失败
  67. if code != e.SUCCESS {
  68. c.JSON(http.StatusUnauthorized, gin.H{
  69. "code": code,
  70. "msg": e.GetMsg(code),
  71. "data": data,
  72. })
  73. c.Abort()
  74. return
  75. }
  76. // FIXME: - 针对POST接口,应判断传入TOKEN对应的用户是否正确(比如判断UserID或AccountID是否对得上等),后期处理
  77. // Token检验成功
  78. c.Next()
  79. }
  80. }
  81. // AuthByHsby 游客鉴权
  82. func AuthByHsby() gin.HandlerFunc {
  83. return func(c *gin.Context) {
  84. // 包含accountID、accountIDs、userID和userIDs等参数需要走正常鉴权
  85. accountID := c.Query("accountID")
  86. accountIDs := c.Query("accountIDs")
  87. userID := c.Query("userID")
  88. userIDs := c.Query("userIDs")
  89. loginID := c.Query("loginID")
  90. if len(accountID) != 0 || len(accountIDs) != 0 || len(userID) != 0 || len(userIDs) != 0 || len(loginID) != 0 {
  91. realToken(c)
  92. return
  93. }
  94. var code int
  95. var data interface{}
  96. code = e.SUCCESS
  97. token := c.GetHeader("Authorization")
  98. if token == "" {
  99. // Token缺失
  100. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  101. } else {
  102. // Token带下划线的走正常鉴权
  103. if strings.Contains(token, "_") {
  104. realToken(c)
  105. return
  106. }
  107. if token != TouristToken {
  108. // Token错误
  109. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  110. }
  111. }
  112. // Token检验失败
  113. if code != e.SUCCESS {
  114. c.JSON(http.StatusUnauthorized, gin.H{
  115. "code": code,
  116. "msg": e.GetMsg(code),
  117. "data": data,
  118. })
  119. c.Abort()
  120. return
  121. }
  122. // Token检验成功
  123. c.Next()
  124. }
  125. }
  126. func realToken(c *gin.Context) {
  127. // if config.SerCfg.GetDebugMode() {
  128. // c.Next()
  129. // return
  130. // }
  131. var code int
  132. var data interface{}
  133. code = e.SUCCESS
  134. token := c.GetHeader("Authorization")
  135. if token == "" {
  136. // Token缺失
  137. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  138. } else {
  139. // 获取loginid
  140. s := strings.Split(token, "_")
  141. loginid := s[0]
  142. // 支持分组功能
  143. group := ""
  144. if len(s) == 3 {
  145. group = s[2]
  146. }
  147. if err := CheckToken(loginid, token, group); err != nil {
  148. // Token错误
  149. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  150. }
  151. }
  152. // Token检验失败
  153. if code != e.SUCCESS {
  154. c.JSON(http.StatusUnauthorized, gin.H{
  155. "code": code,
  156. "msg": e.GetMsg(code),
  157. "data": data,
  158. })
  159. c.Abort()
  160. return
  161. }
  162. // FIXME: - 针对POST接口,应判断传入TOKEN对应的用户是否正确(比如判断UserID或AccountID是否对得上等),后期处理
  163. // Token检验成功
  164. c.Next()
  165. return
  166. }