Преглед на файлове

流式订阅测试通过

qdy преди 3 седмици
родител
ревизия
99b99e1615
променени са 4 файла, в които са добавени 52 реда и са изтрити 34 реда
  1. 41
    25
      authbase/token_auth_middleware.go
  2. 1
    4
      config/subconfigs/configure_config.go
  3. 2
    0
      sdk/configure/client.go
  4. 8
    5
      sdk/configure/config.go

+ 41
- 25
authbase/token_auth_middleware.go Целия файл

@@ -12,22 +12,11 @@ import (
12 12
 	"git.x2erp.com/qdy/go-base/util/jwt"
13 13
 )
14 14
 
15
-// TokenAuth 简化的Bearer认证中间件
16
-func TokenAuth(next http.Handler) http.Handler {
17
-	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
18
-		if logger.IsDebug() {
19
-			logger.Debug("TokenAuth中间件开始处理请求: %s %s", r.Method, r.URL.Path)
20
-		}
21
-		// 1. 检查认证头
22
-		authHeader := r.Header.Get("Authorization")
23
-		if authHeader == "" {
24
-			if logger.IsDebug() {
25
-				logger.Debug("认证头缺失,请求未授权: %s %s", r.Method, r.URL.Path)
26
-			}
27
-			unauthorized(w, "缺少认证信息")
28
-			return
29
-		}
30
-
15
+// extractToken 从请求中提取令牌,优先检查Authorization头,然后检查查询参数
16
+func extractToken(r *http.Request) (string, bool, string) {
17
+	// 1. 优先检查Authorization头
18
+	authHeader := r.Header.Get("Authorization")
19
+	if authHeader != "" {
31 20
 		if logger.IsDebug() {
32 21
 			displayHeader := authHeader
33 22
 			if len(displayHeader) > 20 {
@@ -36,21 +25,48 @@ func TokenAuth(next http.Handler) http.Handler {
36 25
 			logger.Debug("收到认证头: %s", displayHeader)
37 26
 		}
38 27
 
39
-		// 2. 检查Bearer格式
28
+		// 检查Bearer格式
40 29
 		if !strings.HasPrefix(authHeader, "Bearer ") {
30
+			return "", false, "认证格式错误,请使用Bearer认证"
31
+		}
32
+
33
+		token := strings.TrimPrefix(authHeader, "Bearer ")
34
+		return token, true, ""
35
+	}
36
+
37
+	// 2. 检查查询参数
38
+	token := r.URL.Query().Get("token")
39
+	if token != "" {
40
+		if logger.IsDebug() {
41
+			logger.Debug("从查询参数获取token,长度: %d", len(token))
42
+		}
43
+		return token, true, ""
44
+	}
45
+
46
+	// 3. 未找到令牌
47
+	return "", false, "缺少认证信息"
48
+}
49
+
50
+// TokenAuth 简化的Bearer认证中间件,支持从Authorization头或查询参数获取token
51
+func TokenAuth(next http.Handler) http.Handler {
52
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
53
+		if logger.IsDebug() {
54
+			logger.Debug("TokenAuth中间件开始处理请求: %s %s", r.Method, r.URL.Path)
55
+		}
56
+
57
+		// 提取令牌
58
+		token, ok, errMsg := extractToken(r)
59
+		if !ok {
41 60
 			if logger.IsDebug() {
42
-				displayHeader := authHeader
43
-				if len(displayHeader) > 20 {
44
-					displayHeader = displayHeader[:20] + "..."
45
-				}
46
-				logger.Debug("认证格式错误,需要Bearer认证: %s", displayHeader)
61
+				logger.Debug("提取令牌失败: %s, 请求未授权: %s %s", errMsg, r.Method, r.URL.Path)
47 62
 			}
48
-			unauthorized(w, "认证格式错误,请使用Bearer认证")
63
+			unauthorized(w, errMsg)
49 64
 			return
50 65
 		}
51 66
 
52
-		// 3. 解码凭证
53
-		token := strings.TrimPrefix(authHeader, "Bearer ")
67
+		if logger.IsDebug() {
68
+			logger.Debug("验证JWT令牌,令牌长度: %d", len(token))
69
+		}
54 70
 		if logger.IsDebug() {
55 71
 			logger.Debug("验证JWT令牌,令牌长度: %d", len(token))
56 72
 		}

+ 1
- 4
config/subconfigs/configure_config.go Целия файл

@@ -36,10 +36,7 @@ func (c *ConfigureConfig) Validate() error {
36 36
 	if c.Url == "" {
37 37
 		return fmt.Errorf("configure center url must be positive")
38 38
 	}
39
-	// 至少提供一种认证方式
40
-	if c.Token == "" && (c.Username == "" || c.Password == "") {
41
-		return fmt.Errorf("configure center authentication required: provide either token or username/password")
42
-	}
39
+	// 不再强制要求认证凭证,允许无认证模式(用于公开接口如登录)
43 40
 	return nil
44 41
 }
45 42
 

+ 2
- 0
sdk/configure/client.go Целия файл

@@ -356,6 +356,8 @@ func (c *Client) setAuthHeader(req *http.Request) error {
356 356
 		req.SetBasicAuth(c.config.Username, c.config.Password)
357 357
 	case AuthTypeToken:
358 358
 		req.Header.Set("Authorization", "Bearer "+c.config.Token)
359
+	case AuthTypeNone:
360
+		// 无认证,不设置任何认证头
359 361
 	default:
360 362
 		return ErrConfigInvalidAuthType
361 363
 	}

+ 8
- 5
sdk/configure/config.go Целия файл

@@ -14,6 +14,8 @@ const (
14 14
 	AuthTypeBasic AuthType = "basic"
15 15
 	// AuthTypeToken Token认证
16 16
 	AuthTypeToken AuthType = "token"
17
+	// AuthTypeNone 无认证(用于公开接口)
18
+	AuthTypeNone AuthType = "none"
17 19
 )
18 20
 
19 21
 // ClientConfig 客户端配置
@@ -46,7 +48,7 @@ func DefaultConfig() ClientConfig {
46 48
 		Insecure:    false,
47 49
 	}
48 50
 
49
-	// 优先使用Token认证,其次使用Basic认证
51
+	// 优先使用Token认证,其次使用Basic认证,都没有则无认证
50 52
 	if cfg.Token != "" {
51 53
 		clientCfg.AuthType = AuthTypeToken
52 54
 		clientCfg.Token = cfg.Token
@@ -55,9 +57,8 @@ func DefaultConfig() ClientConfig {
55 57
 		clientCfg.Username = cfg.Username
56 58
 		clientCfg.Password = cfg.Password
57 59
 	} else {
58
-		// 默认使用Token,但Token为空(向后兼容,可能使用默认token)
59
-		clientCfg.AuthType = AuthTypeToken
60
-		clientCfg.Token = cfg.Token // 可能为空,由Validate检查
60
+		// 无认证(用于公开接口)
61
+		clientCfg.AuthType = AuthTypeNone
61 62
 	}
62 63
 
63 64
 	return clientCfg
@@ -76,7 +77,7 @@ func (c *ClientConfig) Validate() error {
76 77
 		} else if c.Username != "" && c.Password != "" {
77 78
 			c.AuthType = AuthTypeBasic
78 79
 		} else {
79
-			return ErrConfigInvalidAuth
80
+			c.AuthType = AuthTypeNone // 无认证
80 81
 		}
81 82
 	}
82 83
 
@@ -90,6 +91,8 @@ func (c *ClientConfig) Validate() error {
90 91
 		if c.Token == "" {
91 92
 			return ErrConfigInvalidAuth
92 93
 		}
94
+	case AuthTypeNone:
95
+		// 无认证,无需验证凭证
93 96
 	default:
94 97
 		return ErrConfigInvalidAuthType
95 98
 	}

Loading…
Отказ
Запис