optional_jwt_auth.go 959 B

123456789101112131415161718192021222324252627282930
  1. package middleware
  2. import (
  3. "strings"
  4. "github.com/Wei-Shaw/sub2api/internal/service"
  5. "github.com/gin-gonic/gin"
  6. )
  7. // NewOptionalJWTAuthMiddleware 创建可选 JWT 认证中间件。
  8. //
  9. // 无 Authorization header 时直接放行(匿名,context 中不设置 AuthSubject);
  10. // 带 header 则委托严格 JWT 校验(token 版本 / 用户状态 / 会话绑定),失败返回 401——
  11. // 前端 API client 对 401 会自动走 refresh-token 重试,因此不做静默降级。
  12. func NewOptionalJWTAuthMiddleware(
  13. authService *service.AuthService,
  14. userService *service.UserService,
  15. settingService *service.SettingService,
  16. auditService *service.AuditLogService,
  17. ) OptionalJWTAuthMiddleware {
  18. strict := jwtAuth(authService, userService, userService, settingService, auditService)
  19. return OptionalJWTAuthMiddleware(func(c *gin.Context) {
  20. if strings.TrimSpace(c.GetHeader("Authorization")) == "" {
  21. c.Next()
  22. return
  23. }
  24. strict(c)
  25. })
  26. }