token.go 3.4 KB

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