token.go 4.8 KB

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