Explorar o código

添加jwt token校验

zhangqian hai 1 día
pai
achega
03adec571b
Modificáronse 7 ficheiros con 101 adicións e 36 borrados
  1. 20 0
      app.log
  2. 1 1
      config/config.prod.yaml
  3. 1 1
      config/config.yaml
  4. 1 0
      main.go
  5. 44 33
      middleware/jwt.go
  6. 1 1
      routes/router.go
  7. 33 0
      utils/common.go

+ 20 - 0
app.log

@@ -176,3 +176,23 @@ INFO: 2025/09/04 16:12:38 logger.go:53: Database initialized successfully
 INFO: 2025/09/04 16:12:38 logger.go:53: Server starting on port 8080
 INFO: 2025/12/23 11:32:10 logger.go:53: Starting application...
 INFO: 2025/12/23 11:32:10 logger.go:53: Config loaded successfully
+INFO: 2025/12/23 18:36:15 logger.go:53: Starting application...
+INFO: 2025/12/23 18:36:15 logger.go:53: Config loaded successfully
+INFO: 2025/12/23 18:36:15 logger.go:53: Database initialized successfully
+INFO: 2025/12/23 18:36:15 logger.go:53: Redis initialized successfully
+INFO: 2025/12/23 18:36:15 logger.go:53: Server starting on port 8080
+INFO: 2025/12/23 18:39:45 logger.go:53: Starting application...
+INFO: 2025/12/23 18:39:45 logger.go:53: Config loaded successfully
+INFO: 2025/12/23 18:39:45 logger.go:53: Database initialized successfully
+INFO: 2025/12/23 18:39:45 logger.go:53: Redis initialized successfully
+INFO: 2025/12/23 18:39:45 logger.go:53: Server starting on port 8080
+INFO: 2025/12/23 18:41:15 logger.go:53: Starting application...
+INFO: 2025/12/23 18:41:15 logger.go:53: Config loaded successfully
+INFO: 2025/12/23 18:41:15 logger.go:53: Database initialized successfully
+INFO: 2025/12/23 18:41:15 logger.go:53: Redis initialized successfully
+INFO: 2025/12/23 18:41:15 logger.go:53: Server starting on port 8080
+INFO: 2025/12/23 18:41:58 logger.go:53: Starting application...
+INFO: 2025/12/23 18:41:58 logger.go:53: Config loaded successfully
+INFO: 2025/12/23 18:41:58 logger.go:53: Database initialized successfully
+INFO: 2025/12/23 18:41:58 logger.go:53: Redis initialized successfully
+INFO: 2025/12/23 18:41:58 logger.go:53: Server starting on port 8080

+ 1 - 1
config/config.prod.yaml

@@ -12,7 +12,7 @@ mysql:
   loc: Local
 
 jwt:
-  secret: newaterobot_secret
+  secret: ae0536f9-6450-4606-8e13-5a19ed505da0
   expire: 3600
 
 redis:

+ 1 - 1
config/config.yaml

@@ -12,7 +12,7 @@ mysql:
   loc: Local
 
 jwt:
-  secret: newaterobot_secret
+  secret: ae0536f9-6450-4606-8e13-5a19ed505da0
   expire: 3600
 
 redis:

+ 1 - 0
main.go

@@ -22,6 +22,7 @@ func main() {
 	}
 	utils.Infof("Config loaded successfully")
 
+	utils.SetJWTSecret()
 	// 初始化数据库
 	err = database.InitDB()
 	if err != nil {

+ 44 - 33
middleware/jwt.go

@@ -1,53 +1,64 @@
 package middleware
 
 import (
-	"net/http"
-	"strings"
-	
 	"github.com/gin-gonic/gin"
-	
-	"newaterobot-process/service"
+	"github.com/golang-jwt/jwt/v4"
+	"net/http"
+	"newaterobot-process/utils"
 )
 
 // JWTAuthMiddleware JWT认证中间件
 func JWTAuthMiddleware() gin.HandlerFunc {
 	return func(c *gin.Context) {
-		// 获取token
-		authHeader := c.GetHeader("Authorization")
-		if authHeader == "" {
-			c.JSON(http.StatusUnauthorized, gin.H{
-				"code": 401,
-				"message": "请求未携带token,无权限访问",
-			})
-			c.Abort()
-			return
+
+		if c.Keys == nil {
+			c.Keys = make(map[string]any)
+		}
+		//判断
+		var code int
+		var data interface{}
+		code = http.StatusOK
+		//分别从Header和Query Param当中获取 jwt-token
+		token := c.GetHeader("JWT-TOKEN")
+		if token == "" {
+			token = c.Query("JWT-TOKEN")
 		}
 
-		// 按空格分割
-		parts := strings.SplitN(authHeader, " ", 2)
-		if !(len(parts) == 2 && parts[0] == "Bearer") {
-			c.JSON(http.StatusUnauthorized, gin.H{
-				"code": 401,
-				"message": "请求头中auth格式有误",
-			})
-			c.Abort()
-			return
+		// session未中断
+		if _, ok := c.Keys[utils.SessionUserIdKey]; ok {
+			c.Next()
+		}
+
+		if token == "" {
+			code = http.StatusUnauthorized
+			data = "无法获取token参数"
+		} else {
+			claim, err := utils.ParseTokenWithDep(token)
+			if err != nil {
+				switch err.(*jwt.ValidationError).Errors {
+				case jwt.ValidationErrorExpired:
+					code = http.StatusUnauthorized
+				default:
+					code = http.StatusUnauthorized
+				}
+			}
+
+			if code == http.StatusOK {
+				c.Keys[utils.SessionUserIdKey] = claim.ID
+				c.Keys[utils.SessionDepIdKey] = claim.Dep
+			}
 		}
 
-		// 解析token
-		claims, err := service.GetJWTService().ParseToken(parts[1])
-		if err != nil {
+		if code != http.StatusOK {
 			c.JSON(http.StatusUnauthorized, gin.H{
-				"code": 401,
-				"message": "token无效或已过期",
+				"code": code,
+				"msg":  "token 验证失败",
+				"data": data,
 			})
+
 			c.Abort()
 			return
 		}
-
-		// 将用户信息保存到上下文
-		c.Set("user_id", claims.UserID)
-		c.Set("username", claims.Username)
 		c.Next()
 	}
-}
+}

+ 1 - 1
routes/router.go

@@ -16,13 +16,13 @@ func InitRouter() *gin.Engine {
 	{
 		public.POST("/register", handler.Register)
 		public.POST("/login", handler.Login)
-		public.POST("/metric_process", handler.MetricProcess)
 	}
 
 	// 需要认证的路由
 	private := r.Group("/api/v1")
 	private.Use(middleware.JWTAuthMiddleware())
 	{
+		private.POST("/metric_process", handler.MetricProcess)
 		private.GET("/user/info", handler.GetUserInfo)
 	}
 

+ 33 - 0
utils/common.go

@@ -3,10 +3,43 @@ package utils
 import (
 	"crypto/md5"
 	"fmt"
+	"github.com/golang-jwt/jwt/v4"
+	"newaterobot-process/config"
 	"regexp"
 	"strings"
 )
 
+const (
+	SessionUserIdKey = "uid"
+	SessionDepIdKey  = "dep"
+)
+
+type ClaimsDep struct {
+	ID       int
+	Username string
+	Dep      string
+	jwt.StandardClaims
+}
+
+var jwtSecret []byte
+
+func SetJWTSecret() {
+	jwtSecret = []byte(config.GlobalConfig.JWT.Secret)
+}
+func ParseTokenWithDep(token string) (*ClaimsDep, error) {
+	tokenClaims, err := jwt.ParseWithClaims(token, &ClaimsDep{}, func(token *jwt.Token) (interface{}, error) {
+		return jwtSecret, nil
+	})
+
+	if tokenClaims != nil {
+		if claims, ok := tokenClaims.Claims.(*ClaimsDep); ok && tokenClaims.Valid {
+			return claims, nil
+		}
+	}
+
+	return nil, err
+}
+
 // MD5 字符串MD5加密
 func MD5(s string) string {
 	data := []byte(s)