token.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package middleware
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "iot_manager_service/util/cache"
  5. "iot_manager_service/util/common"
  6. "iot_manager_service/util/token"
  7. "net/http"
  8. "strings"
  9. )
  10. // 验证token令牌的中间件
  11. func AuthMiddleware() gin.HandlerFunc {
  12. return func(c *gin.Context) {
  13. //如果包含路径/login则放行,其余的都要进行token认证
  14. if strings.Contains(c.Request.RequestURI, "/login") ||
  15. strings.Contains(c.Request.RequestURI, "/websocket") ||
  16. strings.Contains(c.Request.RequestURI, "/getpublickey") {
  17. c.Next()
  18. return
  19. }
  20. // 从请求头中获取token
  21. tokeString := c.GetHeader("Authorization")
  22. if tokeString == "" {
  23. c.JSON(http.StatusOK, common.ParamsInvalidResponse("Authorization不能为空", nil))
  24. c.Abort()
  25. return
  26. }
  27. //解析token
  28. claims, err := token.JwtClaims.ParseJwtToken(tokeString)
  29. if err != nil {
  30. c.JSON(http.StatusOK, common.ParamsInvalidResponse("Authorization解析错误", nil))
  31. c.Abort()
  32. return
  33. }
  34. //判断是不是最新一次的token,只有最新的有效,否则无效,不放行
  35. nowuser, err := cache.GetToken(claims.ID)
  36. if nowuser.UUID != claims.UUID || nowuser == nil || err != nil {
  37. c.JSON(http.StatusOK, common.ParamsInvalidResponse("Authorization失效", nil))
  38. c.Abort()
  39. return
  40. }
  41. //刷新redis过期时间
  42. err = cache.RefreshRedisKey(claims.ID)
  43. if err != nil {
  44. c.JSON(http.StatusOK, common.ParamsInvalidResponse("刷新失败", nil))
  45. }
  46. c.Next()
  47. }
  48. }