token.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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, "/getpublicKey") {
  16. c.Next()
  17. return
  18. }
  19. // 从请求头中获取token
  20. tokeString := c.GetHeader("Authorization")
  21. if tokeString == "" {
  22. c.JSON(http.StatusOK, common.ParamsInvalidResponse("Authorization不能为空", nil))
  23. c.Abort()
  24. return
  25. }
  26. //解析token
  27. claims, err := token.JwtClaims.ParseJwtToken(tokeString)
  28. if err != nil {
  29. c.JSON(http.StatusOK, common.ParamsInvalidResponse("Authorization解析错误", nil))
  30. c.Abort()
  31. return
  32. }
  33. //判断是不是最新一次的token,只有最新的有效,否则无效,不放行
  34. redis_uuid, err := cache.GetToken(claims.ID)
  35. if redis_uuid != claims.UUID || redis_uuid == "" || err != nil {
  36. c.JSON(http.StatusOK, common.ParamsInvalidResponse("Authorization失效", nil))
  37. c.Abort()
  38. return
  39. }
  40. c.Next()
  41. }
  42. }