v0.0.23 исправлен cors и ws_auth
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
madipo2611 2025-08-19 23:05:55 +03:00
parent 0e4e687fe9
commit eae5cd2997
2 changed files with 38 additions and 16 deletions

View File

@ -10,21 +10,22 @@ import (
func CORS(allowedOrigins []string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if websocket.IsWebSocketUpgrade(r) {
next.ServeHTTP(w, r)
return
}
origin := r.Header.Get("Origin")
if IsOriginAllowed(origin, allowedOrigins) {
w.Header().Set("Access-Control-Allow-Origin", origin)
w.Header().Set("Access-Control-Allow-Credentials", "true")
w.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, Authorization, bypass-auth")
w.Header().Set("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS")
// Для WebSocket тоже нужны CORS заголовки
if websocket.IsWebSocketUpgrade(r) {
w.Header().Set("Access-Control-Allow-Headers",
"Authorization, Sec-WebSocket-Protocol, Sec-WebSocket-Version, Sec-WebSocket-Key")
} else {
w.Header().Set("Access-Control-Allow-Headers",
"Accept, Content-Type, Content-Length, Accept-Encoding, Authorization, bypass-auth")
w.Header().Set("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS")
}
}
if r.Method == "OPTIONS" {

View File

@ -3,11 +3,11 @@ package middleware
import (
"context"
"net/http"
"strings"
"tailly_back_v2/pkg/auth"
"time"
)
// WSAuthMiddleware проверяет JWT токен для WebSocket соединений
func WSAuthMiddleware(tokenAuth *auth.TokenAuth) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@ -15,24 +15,45 @@ func WSAuthMiddleware(tokenAuth *auth.TokenAuth) func(http.Handler) http.Handler
ctx, cancel := context.WithTimeout(r.Context(), 30*time.Minute)
defer cancel()
token := extractTokenFromRequest(r)
token := extractTokenFromWSRequest(r) // ← Исправленная функция
if token != "" {
if userID, err := tokenAuth.ValidateAccessToken(token); err == nil {
ctx = context.WithValue(ctx, userIDKey, userID)
r = r.WithContext(ctx)
} else {
// Отклоняем соединение при невалидном токене
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
} else {
// Отклоняем соединение без токена
http.Error(w, "Authentication required", http.StatusUnauthorized)
return
}
r = r.WithContext(ctx)
}
next.ServeHTTP(w, r)
})
}
}
func extractTokenFromRequest(r *http.Request) string {
// Только проверка кук (как в вашем коде)
cookie, err := r.Cookie("accessToken")
if err == nil {
func extractTokenFromWSRequest(r *http.Request) string {
// 1. Проверяем заголовок Authorization (WebSocket использует его)
if authHeader := r.Header.Get("Authorization"); authHeader != "" {
if strings.HasPrefix(authHeader, "Bearer ") {
return strings.TrimPrefix(authHeader, "Bearer ")
}
return authHeader // На случай если без Bearer prefix
}
// 2. Проверяем query parameter (альтернативный способ)
if token := r.URL.Query().Get("token"); token != "" {
return token
}
// 3. Проверяем куки (последний вариант)
if cookie, err := r.Cookie("accessToken"); err == nil {
return cookie.Value
}
return ""
}