token.go 3.7 KB

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