Estoy teniendo dificultades para entender cómo usar negroni y httprouter juntos.

Tengo un par de rutas públicas, como /api/v1/ping

Tengo un montón de rutas privadas que necesitan un middleware de autenticación, como /api/v1/user

Si quiero un middleware común de negroni para todas mis rutas, pero quiero aplicar el middleware de autenticación y otros solo a las rutas privadas, ¿cómo puedo configurar esto?

v1.router := httprouter.New()
v1.router.GET("/api/v1/ping", v1.ping)
v1.router.GET("/api/v1/user", v1.getUsers)

n := negroni.Classic()
n.UseHandler(v1.router)

http.ListenAndServe(port, n)
1
user1354934 19 oct. 2019 a las 05:28

1 respuesta

La mejor respuesta

Puede intentar adaptar la técnica descrita en "Middleware de prefijo de ruta en Go", que utiliza net/http/#ServeMux, con otro enrutador (gorilla/mux), pero debería ser válido para julienschmidt/httprouter también:

Especificar middleware basado en prefijos de ruta

Aquí es donde ocurre la magia y también es donde las cosas se vuelven confusas.

La forma más sencilla que he encontrado de especificar middleware para un prefijo de ruta es configurar un segundo muxer (usamos la variable sirMuxalot para la nuestra a continuación) que tiene los prefijos de ruta a los que queremos aplicar el middleware y luego pasar nuestro enrutador original envuelto en algún middleware para esas rutas.

Esto funciona porque el enrutador sirMuxalot nunca llamará al enrutador envuelto en middleware a menos que el prefijo de ruta que definamos coincida con la ruta de la solicitud web entrante.

sirMuxalot := http.NewServeMux()
sirMuxalot.Handle("/", r)
sirMuxalot.Handle("/api/", negroni.New(
    negroni.HandlerFunc(APIMiddleware),
    negroni.Wrap(r),
))
sirMuxalot.Handle("/dashboard/", negroni.New(
    negroni.HandlerFunc(DashboardMiddleware),
    negroni.Wrap(r),
))

n := negroni.Classic()
n.UseHandler(sirMuxalot)
http.ListenAndServe(":3000", n)
1
VonC 19 oct. 2019 a las 04:14