|
|
@@ -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
|
}
|