token.go 4.6 KB

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