44 lines
1.5 KiB
JavaScript
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' });
|
|
};
|
|
}
|