44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
package middlewares
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"abuse_registration_poc/internal/handlers"
|
|
"abuse_registration_poc/internal/utils"
|
|
)
|
|
|
|
type contextKey string
|
|
|
|
const (
|
|
RoleContextKey contextKey = "role"
|
|
UserIDContextKey contextKey = "userId"
|
|
)
|
|
|
|
func Authenticate(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
|
|
token := strings.TrimSpace(request.Header.Get("Authorization"))
|
|
if token == "" {
|
|
handlers.WriteJSON(writer, http.StatusUnauthorized, map[string]string{"message": "Not authorized."})
|
|
return
|
|
}
|
|
token = strings.TrimPrefix(token, "Bearer ")
|
|
|
|
userID, role, err := utils.VerifyToken(token)
|
|
if err != nil {
|
|
handlers.WriteJSON(writer, http.StatusUnauthorized, map[string]string{"message": "Not authorized."})
|
|
return
|
|
}
|
|
|
|
ctx := context.WithValue(request.Context(), RoleContextKey, role)
|
|
ctx = context.WithValue(ctx, UserIDContextKey, userID)
|
|
next.ServeHTTP(writer, request.WithContext(ctx))
|
|
})
|
|
}
|
|
|
|
func RoleFromContext(ctx context.Context) (string, bool) {
|
|
role, ok := ctx.Value(RoleContextKey).(string)
|
|
return role, ok
|
|
}
|