token.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. if len(accountID) != 0 || len(accountIDs) != 0 || len(userID) != 0 || len(userIDs) != 0 {
  74. realToken(c)
  75. return
  76. }
  77. var code int
  78. var data interface{}
  79. code = e.SUCCESS
  80. token := c.GetHeader("Authorization")
  81. if token == "" {
  82. // Token缺失
  83. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  84. } else {
  85. // Token带下划线的走正常鉴权
  86. if strings.Contains(token, "_") {
  87. realToken(c)
  88. return
  89. }
  90. if token != TouristToken {
  91. // Token错误
  92. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  93. }
  94. }
  95. // Token检验失败
  96. if code != e.SUCCESS {
  97. c.JSON(http.StatusUnauthorized, gin.H{
  98. "code": code,
  99. "msg": e.GetMsg(code),
  100. "data": data,
  101. })
  102. c.Abort()
  103. return
  104. }
  105. // Token检验成功
  106. c.Next()
  107. }
  108. }
  109. func realToken(c *gin.Context) {
  110. if config.SerCfg.GetDebugMode() {
  111. c.Next()
  112. return
  113. }
  114. var code int
  115. var data interface{}
  116. code = e.SUCCESS
  117. token := c.GetHeader("Authorization")
  118. if token == "" {
  119. // Token缺失
  120. code = e.ERROR_AUTH_CHECK_TOKEN_MISSING
  121. } else {
  122. // 获取loginid
  123. s := strings.Split(token, "_")
  124. loginid := s[0]
  125. if err := CheckToken(loginid, token); err != nil {
  126. // Token错误
  127. code = e.ERROR_AUTH_CHECK_TOKEN_FAIL
  128. }
  129. }
  130. // Token检验失败
  131. if code != e.SUCCESS {
  132. c.JSON(http.StatusUnauthorized, gin.H{
  133. "code": code,
  134. "msg": e.GetMsg(code),
  135. "data": data,
  136. })
  137. c.Abort()
  138. return
  139. }
  140. // FIXME: - 针对POST接口,应判断传入TOKEN对应的用户是否正确(比如判断UserID或AccountID是否对得上等),后期处理
  141. // Token检验成功
  142. c.Next()
  143. return
  144. }