Tengo algunas rutas en mi API. Y tener un middleware. Está creando un token de portador y comprobándolo. Pero quiero que algunas de mis rutas no ingresen a ese middleware para poder acceder sin token. ¿Cómo puedo hacerlo? Mi software intermedio:
app.use(async (req, res, next) => { if ( req.path === "/api/v1/collection/byhome" || // I dont want that part. req.path === "/api/v1/user/login" // Its working but its not looks like best solution. ) { next(); } else { const bearerHeader = req.header("authorization"); if (typeof bearerHeader !== "undefined") { const bearer = bearerHeader.split(" "); const bearerToken = bearer[1]; req.token = bearerToken; jwt.verify(req.token, process.env.SECRETKEY, async (err, authData) => { if (err) { res.sendStatus(401); } else { next(); } }); } else { res.statusCode = 400; const Response = { message: "Invalid Token", StatusCode: res.statusCode, }; res.json(Response); } } });
Mi ruta:
app.get( `/api/${version}/article/bycollection/:id`, ArticleRoute.getbycollection );
su forma de hacerlo es correcta, puede hacer que su código sea más legible haciendo una matriz de todo el middleware que desea que esté fuera del alcance de su middleware
const whiteListEndpoints = ["/api/v1/this", "/api/v1/this1", "/api/v1/this2"]
después
// your middleware app.use((req, res,next) => { //if the path was in the whitelist just call next function if(whiteListEndpoints.includes(req.url)) return next() // let the middlware do it's job })
o puede cambiar su orden de use
expreso
const firstRoute = app.use("/no_middleware", router); app.use((req, res, next) => {}) // your middleware const secondRoute = app.use("/with_middleware", router);
aquí el primer enrutador no usará el middleware ya que aún no ha sido llamado.
Puede usar Express.Router
para lograr el resultado deseado. Con el enrutador express puede diferenciar entre rutas y tener diferentes middlewares para cada enrutador.
Siga los pasos que se indican a continuación:
middlewares/private.authenticate.js
function auth(req, res, next) { // do auth stuff... next(); }
routes/private/index.js
// private route handler import { Router } from "express"; import auth from "./middlewares/private.authenticate.js"; const router = Router(); router.use(auth); // use auth middleware router.route("/") .get() .put() export default router;
routes/public/index.js
import { Router } from "express"; const router = Router(); router.route("/") .get() .put() export default router;
import express from "express"; const app = express(); import PublicRoutes from "./routes/public"; import PrivateRoutes from "./routes/private"; // public routes path app.use("/api/public", PublicRoutes); // private routes path app.use("/api/private", PrivateRoutes);
Puede crear una ruta express.Router()
y configurarla en una path
, este enrutador tiene toda la autenticación, luego cree un segundo express.Router()
y esto sin autenticación.
var router = express.Router(); // your code for API auth... router.get('/api/v1/collection/byhome',myMiddleware, (req, res, next) => { res.send('Hey There'); }) app.use('/api', router); var routerGuest = express.Router(); // routerGuest.get('/', (req, res, next) => { res.send('Hey There'); }) app.use('/guest', routerGuest)
para la autenticación, recomiendo hacer un middleware separado y luego pasarlo a nuestra ruta
function myMiddleware(req, res, next){ const bearerHeader = req.header("authorization"); if (typeof bearerHeader !== "undefined") { const bearer = bearerHeader.split(" "); const bearerToken = bearer[1]; req.token = bearerToken; jwt.verify(req.token, process.env.SECRETKEY, async (err, authData) => { if (err) { res.sendStatus(401); } else { next(); } }); } else { res.statusCode = 400; const Response = { message: "Invalid Token", StatusCode: res.statusCode, }; res.json(Response); } } }
Creo que con esto puedes tener alguna idea para hacerlo :)