token.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. // windows下方便开发调试, 不做token校验
  41. if config.SerCfg.GetDebugMode() &&
  42. runtime.GOOS == "windows" {
  43. c.Next()
  44. return
  45. }
  46. var code int
  47. var data interface{}
  48. code = e.SUCCESS
  49. token := c.GetHeader("Authorization")
  50. if token == "" {
  51. // Token缺失
  52. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  53. } else {
  54. // 获取loginid
  55. s := strings.Split(token, "_")
  56. loginid := s[0]
  57. // 支持分组功能
  58. group := ""
  59. if len(s) == 3 {
  60. group = s[2]
  61. }
  62. if err := CheckToken(loginid, token, group); err != nil {
  63. // Token错误
  64. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  65. }
  66. }
  67. // Token检验失败
  68. if code != e.SUCCESS {
  69. c.JSON(http.StatusUnauthorized, gin.H{
  70. "code": code,
  71. "msg": e.GetMsg(code),
  72. "data": data,
  73. })
  74. c.Abort()
  75. return
  76. }
  77. // FIXME: - 针对POST接口,应判断传入TOKEN对应的用户是否正确(比如判断UserID或AccountID是否对得上等),后期处理
  78. // Token检验成功
  79. c.Next()
  80. }
  81. }
  82. // AuthByHsby 游客鉴权
  83. func AuthByHsby() gin.HandlerFunc {
  84. return func(c *gin.Context) {
  85. // 包含accountID、accountIDs、userID和userIDs等参数需要走正常鉴权
  86. accountID := c.Query("accountID")
  87. accountIDs := c.Query("accountIDs")
  88. userID := c.Query("userID")
  89. userIDs := c.Query("userIDs")
  90. loginID := c.Query("loginID")
  91. if len(accountID) != 0 || len(accountIDs) != 0 || len(userID) != 0 || len(userIDs) != 0 || len(loginID) != 0 {
  92. realToken(c)
  93. return
  94. }
  95. var code int
  96. var data interface{}
  97. code = e.SUCCESS
  98. token := c.GetHeader("Authorization")
  99. if token == "" {
  100. // Token缺失
  101. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  102. } else {
  103. // Token带下划线的走正常鉴权
  104. if strings.Contains(token, "_") {
  105. realToken(c)
  106. return
  107. }
  108. if token != TouristToken {
  109. // Token错误
  110. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  111. }
  112. }
  113. // Token检验失败
  114. if code != e.SUCCESS {
  115. c.JSON(http.StatusUnauthorized, gin.H{
  116. "code": code,
  117. "msg": e.GetMsg(code),
  118. "data": data,
  119. })
  120. c.Abort()
  121. return
  122. }
  123. // Token检验成功
  124. c.Next()
  125. }
  126. }
  127. func realToken(c *gin.Context) {
  128. // if config.SerCfg.GetDebugMode() {
  129. // c.Next()
  130. // return
  131. // }
  132. var code int
  133. var data interface{}
  134. code = e.SUCCESS
  135. token := c.GetHeader("Authorization")
  136. if token == "" {
  137. // Token缺失
  138. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  139. } else {
  140. // 获取loginid
  141. s := strings.Split(token, "_")
  142. loginid := s[0]
  143. // 支持分组功能
  144. group := ""
  145. if len(s) == 3 {
  146. group = s[2]
  147. }
  148. if err := CheckToken(loginid, token, group); err != nil {
  149. // Token错误
  150. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  151. }
  152. }
  153. // Token检验失败
  154. if code != e.SUCCESS {
  155. c.JSON(http.StatusUnauthorized, gin.H{
  156. "code": code,
  157. "msg": e.GetMsg(code),
  158. "data": data,
  159. })
  160. c.Abort()
  161. return
  162. }
  163. // FIXME: - 针对POST接口,应判断传入TOKEN对应的用户是否正确(比如判断UserID或AccountID是否对得上等),后期处理
  164. // Token检验成功
  165. c.Next()
  166. return
  167. }