package middleware import ( "net/http" "strings" "github.com/gin-gonic/gin" "github.com/sundynix/sundynix-gateway/internal/auth" ) // CtxUserID 是鉴权后写入 gin.Context 的已验证用户 ID 键。 const CtxUserID = "uid" // Auth 解析 Authorization: Bearer ,校验通过则把已验证 userID 写入上下文。 // 非阻断:无 token / 无效 token 时不报错,由各 handler(经 userID 兜底 header)或 // 后续 RequireAuth 决定是否放行。 func Auth() gin.HandlerFunc { return func(c *gin.Context) { h := c.GetHeader("Authorization") if strings.HasPrefix(h, "Bearer ") { if uid, err := auth.Parse(strings.TrimSpace(h[len("Bearer "):])); err == nil { c.Set(CtxUserID, uid) } } c.Next() } } // RequireAuth 在 Auth 之后使用:上下文无已验证 userID 则 401 拒绝。 // 用于 owner 作用域的业务路由;SSE/导出等按 task_id 寻址的端点不挂(EventSource 无法带头)。 func RequireAuth() gin.HandlerFunc { return func(c *gin.Context) { if v, ok := c.Get(CtxUserID); ok { if s, _ := v.(string); s != "" { c.Next() return } } c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "需要登录"}) } }