2025-10-16 19:49:50 +00:00

44 lines
1.5 KiB
JavaScript

// packages/core/middlewares/src/requireAuth.mjs
// @suitecoffee/middlewares/src/requireAuth.mjs
/**
* requireAuth
* Verifica que exista una sesión válida en req.session.user (con `sub`).
* - Si hay sesión, llama a next().
* - Si no hay sesión:
* - Si se define `redirectTo`, redirige (302) cuando el cliente acepta HTML.
* - En caso contrario, responde 401 con { error: 'unauthenticated' }.
*
* @param {Object} [options]
* @param {string|null} [options.redirectTo=null] Ruta a la que redirigir si no hay sesión (p.ej. '/auth/login')
* @param {(req: import('express').Request) => any} [options.getSessionUser] Cómo leer el usuario de la sesión
* @returns {import('express').RequestHandler}
*
* Uso típico:
* import { requireAuth } from '@suitecoffee/middlewares';
* app.get('/me', requireAuth(), (req,res)=> res.json({ user: req.session.user }));
* app.get('/dashboard', requireAuth({ redirectTo: '/auth/login' }), handler);
*/
export function requireAuth(options = {}) {
const {
redirectTo = null,
getSessionUser = (req) => req?.session?.user,
} = options;
return function requireAuthMiddleware(req, res, next) {
const user = getSessionUser(req);
if (user && user.sub) {
return next();
}
// Si el cliente acepta HTML y tenemos redirectTo, redirigimos (útil para front web)
if (redirectTo && req.accepts('html')) {
return res.redirect(302, redirectTo);
}
// Fallback JSON
return res.status(401).json({ error: 'unauthenticated' });
};
}