package handlers import ( "context" "net/http" "strings" ) // ctxKey est un type privé pour les clefs de contexte (évite les collisions). type ctxKey string // userIDKey est la clef de contexte sous laquelle on stocke l'ID utilisateur authentifié. const userIDKey ctxKey = "userID" // RequireAuth est un middleware qui valide l'access token Bearer et injecte // l'ID utilisateur dans le contexte de la requête. func (a *API) RequireAuth(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { header := r.Header.Get("Authorization") const prefix = "Bearer " if !strings.HasPrefix(header, prefix) { writeError(w, http.StatusUnauthorized, "en-tête Authorization manquant ou invalide") return } tokenString := strings.TrimSpace(strings.TrimPrefix(header, prefix)) claims, err := a.Auth.ParseAccessToken(tokenString) if err != nil { writeError(w, http.StatusUnauthorized, "token invalide ou expiré") return } ctx := context.WithValue(r.Context(), userIDKey, claims.UserID) next.ServeHTTP(w, r.WithContext(ctx)) }) } // userIDFromContext récupère l'ID utilisateur stocké par RequireAuth. func userIDFromContext(ctx context.Context) string { id, _ := ctx.Value(userIDKey).(string) return id }