劲创营---任务项目
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

144 lignes
3.7 KiB

  1. package mw
  2. import (
  3. "applet/app/comm/db"
  4. "applet/app/comm/db/model"
  5. "applet/app/comm/e"
  6. "applet/app/comm/md"
  7. "applet/app/comm/svc"
  8. "applet/app/comm/utils"
  9. "applet/app/comm/utils/cache"
  10. "applet/app/comm/utils/logx"
  11. "applet/app/lib/auth"
  12. "errors"
  13. "fmt"
  14. "strings"
  15. "github.com/gin-gonic/gin"
  16. )
  17. // AuthJWT is jwt middleware
  18. func AuthJWT(c *gin.Context) {
  19. requestType := c.Request.Header.Get("Request-Type")
  20. requestUid := c.Request.Header.Get("Request-uid")
  21. var mc = new(auth.JWTUser)
  22. var err error
  23. var parts = make([]string, 2)
  24. if requestType != "mq_consume" {
  25. authHeader := c.Request.Header.Get("Authorization")
  26. fmt.Println("test================,", authHeader)
  27. if authHeader == "" {
  28. e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("token 不能为空"))
  29. return
  30. }
  31. // 按空格分割
  32. parts = strings.SplitN(authHeader, " ", 2)
  33. fmt.Println("test1================,", parts)
  34. if !(len(parts) == 2 && parts[0] == "Bearer") {
  35. e.OutErr(c, e.ERR_TOKEN_FORMAT, errors.New("token 格式不对"))
  36. return
  37. }
  38. // parts[1]是token
  39. mc, err = utils.ParseToken(parts[1])
  40. fmt.Println("test3================,", mc)
  41. if err != nil {
  42. e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("token 过期或无效"))
  43. return
  44. }
  45. } else {
  46. mc.UID = utils.StrToInt(requestUid)
  47. }
  48. //fmt.Println(mc.UID)
  49. // 获取user
  50. u, err := db.UserFindByID(db.DBs[c.GetString("mid")], mc.UID)
  51. fmt.Println("test4================,", u)
  52. fmt.Println("test5================,", mc.UID)
  53. if err != nil {
  54. e.OutErr(c, e.ERR_DB_ORM, err)
  55. return
  56. }
  57. if u == nil {
  58. e.OutErr(c, e.ERR_UNAUTHORIZED, errors.New("token 过期或无效"))
  59. return
  60. }
  61. // 检验账号是否未激活或被冻结
  62. switch u.State {
  63. case 0:
  64. e.OutErr(c, e.ERR_USER_NO_ACTIVE)
  65. return
  66. case 2:
  67. e.OutErr(c, e.ERR_USER_IS_BAN)
  68. return
  69. }
  70. if requestType != "mq_consume" {
  71. // 校验是否和缓存的token一致,只能有一个token 是真实有效
  72. key := fmt.Sprintf("%s:token:%s", c.GetString("mid"), u.Username)
  73. //fmt.Println(key)
  74. cjwt, err := cache.GetString(key)
  75. fmt.Println("====================token", u.Username, key, cjwt, parts[1])
  76. if err != nil {
  77. fmt.Println("====================token", err)
  78. if c.GetString("mid") == "58919110" {
  79. utils.FilePutContents("token0", u.Username+" "+cjwt+" "+err.Error())
  80. }
  81. logx.Warn(err)
  82. NOCACHE(c, parts, mc, u, false)
  83. return
  84. }
  85. if parts[1] != cjwt {
  86. if c.GetString("mid") == "58919110" {
  87. utils.FilePutContents("token1", u.Username+" "+cjwt+" "+parts[1]+" false")
  88. }
  89. e.OutErr(c, e.ERR_TOKEN_AUTH, errors.New("token expired"))
  90. return
  91. }
  92. }
  93. NOCACHE(c, parts, mc, u, true)
  94. }
  95. func NOCACHE(c *gin.Context, parts []string, mc *auth.JWTUser, u *model.User, isTrue bool) {
  96. // 获取user profile
  97. up, err := db.UserProfileFindByID(db.DBs[c.GetString("mid")], mc.UID)
  98. if err != nil || up == nil {
  99. e.OutErr(c, e.ERR_DB_ORM, err)
  100. return
  101. }
  102. if parts[1] != up.ArkidToken && isTrue == false {
  103. if c.GetString("mid") == "58919110" {
  104. utils.FilePutContents("token2", u.Username+" "+up.ArkidToken+" "+parts[1]+" false")
  105. }
  106. e.OutErr(c, e.ERR_TOKEN_AUTH, errors.New("token expired"))
  107. return
  108. }
  109. if parts[1] != up.ArkidToken && isTrue {
  110. up.ArkidToken = parts[1]
  111. db.UserProfileUpdate(svc.MasterDb(c), up.Uid, up, "arkid_token")
  112. }
  113. if up.AvatarUrl == "" {
  114. up.AvatarUrl = c.GetString("appUserDefaultAvatar")
  115. }
  116. // 获取user 等级
  117. ul, err := db.UserLevelByID(db.DBs[c.GetString("mid")], u.Level)
  118. if err != nil {
  119. e.OutErr(c, e.ERR_DB_ORM, err)
  120. return
  121. }
  122. user := &md.User{
  123. Info: u,
  124. Profile: up,
  125. Level: ul,
  126. }
  127. // 将当前请求的username信息保存到请求的上下文c上
  128. c.Set("user", user)
  129. // 异步处理 有效会员和新会员
  130. c.Next() // 后续的处理函数可以用过c.Get("user")来获取当前请求的用户信息
  131. }