53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"git.echol.cn/loser/ai_proxy/server/service"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
var aiApiKeyService = service.ServiceGroupApp.AppServiceGroup.AiApiKeyService
|
|
|
|
// AiAuth AI接口鉴权中间件
|
|
func AiAuth() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
// 从请求头获取 Authorization
|
|
authHeader := c.GetHeader("Authorization")
|
|
if authHeader == "" {
|
|
c.JSON(http.StatusUnauthorized, gin.H{
|
|
"error": gin.H{
|
|
"message": "未提供API密钥",
|
|
"type": "invalid_request_error",
|
|
"code": "missing_api_key",
|
|
},
|
|
})
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
// 提取 API Key (支持 "Bearer sk-xxx" 和 "sk-xxx" 两种格式)
|
|
apiKey := strings.TrimPrefix(authHeader, "Bearer ")
|
|
apiKey = strings.TrimSpace(apiKey)
|
|
|
|
// 验证 API Key
|
|
keyInfo, err := aiApiKeyService.ValidateApiKey(apiKey)
|
|
if err != nil {
|
|
c.JSON(http.StatusUnauthorized, gin.H{
|
|
"error": gin.H{
|
|
"message": err.Error(),
|
|
"type": "invalid_request_error",
|
|
"code": "invalid_api_key",
|
|
},
|
|
})
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
// 将密钥信息存入上下文
|
|
c.Set("ai_api_key", keyInfo)
|
|
c.Next()
|
|
}
|
|
}
|