Files
wx_service/internal/middleware/auth_middleware.go
T
nepiedg d23b253609 Enhance API and error handling for video services
- Updated .gitignore to exclude cache files.
- Refactored main.go to streamline route registration and improve code organization.
- Added detailed comments in auth_handler.go, video_handler.go, and service files for better clarity on request handling and service logic.
- Improved error messages in video_handler.go to provide clearer feedback to users in Chinese.
- Introduced context handling in service methods to manage request timeouts effectively.
2025-12-31 02:30:20 +00:00

56 lines
1.4 KiB
Go

package middleware
import (
"net/http"
"strings"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"wx_service/internal/model"
)
const ContextCurrentUserKey = "currentUser"
func AuthMiddleware(db *gorm.DB) gin.HandlerFunc {
// AuthMiddleware 是一个 Gin 中间件:
// - 从 Authorization: Bearer <token> 里取 token
// - 用 token(这里是 session_key)查用户
// - 查到后放进 gin.Context,供后面的 handler 使用
return func(c *gin.Context) {
token := extractToken(c.GetHeader("Authorization"))
if token == "" {
c.AbortWithStatusJSON(http.StatusUnauthorized, model.Error(http.StatusUnauthorized, "missing authorization header"))
return
}
var user model.User
if err := db.WithContext(c.Request.Context()).Where("session_key = ?", token).First(&user).Error; err != nil {
if err == gorm.ErrRecordNotFound {
c.AbortWithStatusJSON(http.StatusUnauthorized, model.Error(http.StatusUnauthorized, "invalid token"))
return
}
c.AbortWithStatusJSON(http.StatusInternalServerError, model.Error(http.StatusInternalServerError, "load user failed"))
return
}
c.Set(ContextCurrentUserKey, &user)
c.Next()
}
}
func extractToken(authHeader string) string {
// 常见格式:Authorization: Bearer <token>
if authHeader == "" {
return ""
}
parts := strings.SplitN(authHeader, " ", 2)
if len(parts) != 2 {
return ""
}
if !strings.EqualFold(parts[0], "Bearer") {
return ""
}
return strings.TrimSpace(parts[1])
}