57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
package logging
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
jwtx "tyc-server/common/jwt"
|
||
|
||
"github.com/zeromicro/go-zero/core/logx"
|
||
)
|
||
|
||
// jwtExtractor JWT用户信息提取器
|
||
type jwtExtractor struct {
|
||
jwtSecret string
|
||
}
|
||
|
||
// newJWTExtractor 创建JWT提取器
|
||
func newJWTExtractor(jwtSecret string) *jwtExtractor {
|
||
return &jwtExtractor{
|
||
jwtSecret: jwtSecret,
|
||
}
|
||
}
|
||
|
||
// ExtractUserInfo 从Authorization头部提取用户信息
|
||
func (e *jwtExtractor) ExtractUserInfo(authHeader string) (userID, username string) {
|
||
if authHeader == "" {
|
||
return "", ""
|
||
}
|
||
|
||
// 检查Bearer前缀
|
||
if !strings.HasPrefix(authHeader, "Bearer ") {
|
||
return "", ""
|
||
}
|
||
|
||
// 提取Token
|
||
tokenString := strings.TrimPrefix(authHeader, "Bearer ")
|
||
if tokenString == "" {
|
||
return "", ""
|
||
}
|
||
|
||
// 解析JWT Token
|
||
userIDInt, err := jwtx.ParseJwtToken(tokenString, e.jwtSecret)
|
||
if err != nil {
|
||
logx.Errorf("解析JWT Token失败: %v", err)
|
||
return "", ""
|
||
}
|
||
|
||
// 提取用户信息
|
||
if userIDInt > 0 {
|
||
userID = fmt.Sprintf("%d", userIDInt)
|
||
// 由于JWT中只包含用户ID,用户名需要从其他地方获取
|
||
// 这里可以调用用户服务获取用户名,或者暂时使用用户ID
|
||
username = fmt.Sprintf("user_%d", userIDInt)
|
||
}
|
||
|
||
return userID, username
|
||
}
|