token.go 4.1 KB

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