|
|
|
@@ -30,6 +30,32 @@ func validUserInfo(username string, role int) bool { |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
// parseTokenKey 解析令牌字符串,提取 key 和可选的 channelId |
|
|
|
// 支持格式:sk-{key} 或 sk-{key}:{channelId} 或 sk-{key}-{channelId} |
|
|
|
// 返回:key, parts(parts[0]=key, parts[1]=channelId 如果指定) |
|
|
|
func parseTokenKey(key string) (string, []string) { |
|
|
|
key = strings.TrimPrefix(key, "sk-") |
|
|
|
|
|
|
|
// 先按冒号分割获取 channelId(新格式:sk-{key}:{channelId}) |
|
|
|
var colonChannelId string |
|
|
|
if colonIdx := strings.Index(key, ":"); colonIdx != -1 { |
|
|
|
colonChannelId = key[colonIdx+1:] |
|
|
|
key = key[:colonIdx] |
|
|
|
} |
|
|
|
|
|
|
|
parts := strings.Split(key, "-") |
|
|
|
key = parts[0] |
|
|
|
|
|
|
|
// 如果冒号方式指定了渠道,验证并追加到 parts |
|
|
|
if colonChannelId != "" { |
|
|
|
// 验证 channelId 为有效数字,防止 sk-abc:def:ghi 等格式 |
|
|
|
if _, err := strconv.Atoi(colonChannelId); err == nil { |
|
|
|
parts = append(parts, colonChannelId) |
|
|
|
} |
|
|
|
} |
|
|
|
return key, parts |
|
|
|
} |
|
|
|
|
|
|
|
func authHelper(c *gin.Context, minRole int) { |
|
|
|
session := sessions.Default(c) |
|
|
|
username := session.Get("username") |
|
|
|
@@ -293,34 +319,8 @@ func TokenAuth() func(c *gin.Context) { |
|
|
|
if strings.HasPrefix(key, "Bearer ") || strings.HasPrefix(key, "bearer ") { |
|
|
|
key = strings.TrimSpace(key[7:]) |
|
|
|
} |
|
|
|
key = strings.TrimPrefix(key, "sk-") |
|
|
|
// 先按冒号分割获取 channelId(新格式:sk-{key}:{channelId}) |
|
|
|
var colonChannelId string |
|
|
|
if colonIdx := strings.Index(key, ":"); colonIdx != -1 { |
|
|
|
colonChannelId = key[colonIdx+1:] |
|
|
|
key = key[:colonIdx] |
|
|
|
} |
|
|
|
parts = strings.Split(key, "-") |
|
|
|
key = parts[0] |
|
|
|
// 如果冒号方式指定了渠道,追加到 parts |
|
|
|
if colonChannelId != "" { |
|
|
|
parts = append(parts, colonChannelId) |
|
|
|
} |
|
|
|
} else { |
|
|
|
key = strings.TrimPrefix(key, "sk-") |
|
|
|
// 先按冒号分割获取 channelId(新格式:sk-{key}:{channelId}) |
|
|
|
var colonChannelId string |
|
|
|
if colonIdx := strings.Index(key, ":"); colonIdx != -1 { |
|
|
|
colonChannelId = key[colonIdx+1:] |
|
|
|
key = key[:colonIdx] |
|
|
|
} |
|
|
|
parts = strings.Split(key, "-") |
|
|
|
key = parts[0] |
|
|
|
// 如果冒号方式指定了渠道,追加到 parts |
|
|
|
if colonChannelId != "" { |
|
|
|
parts = append(parts, colonChannelId) |
|
|
|
} |
|
|
|
} |
|
|
|
key, parts = parseTokenKey(key) |
|
|
|
token, err := model.ValidateUserToken(key) |
|
|
|
if token != nil { |
|
|
|
id := c.GetInt("id") |
|
|
|
|