← back to AbramsOS

middleware/auth.js

33 lines

const auth = require('../lib/auth');

// Hydrate req.session + req.userId from the cookie
async function loadSessionMiddleware(req, _res, next) {
  const sid = req.cookies?.[auth.SESSION_COOKIE] || req.signedCookies?.[auth.SESSION_COOKIE];
  if (!sid) return next();
  const session = await auth.loadSession(sid);
  if (!session) return next();
  req.session = session;
  req.userId = session.user_id;
  next();
}

// Reject unauthenticated requests; redirect HTML to /signin, JSON gets 401
function requireAuth(req, res, next) {
  if (req.userId) return next();
  if (req.accepts('html')) return res.redirect('/signin?next=' + encodeURIComponent(req.originalUrl));
  return res.status(401).json({ error: 'unauthenticated' });
}

// Require recent (within 60s) successful TOTP verify
function requireStepUp(req, res, next) {
  if (!req.userId) {
    if (req.accepts('html')) return res.redirect('/signin?next=' + encodeURIComponent(req.originalUrl));
    return res.status(401).json({ error: 'unauthenticated' });
  }
  if (auth.isStepUpValid(req.session)) return next();
  if (req.accepts('html')) return res.redirect('/step-up?next=' + encodeURIComponent(req.originalUrl));
  return res.status(403).json({ error: 'step_up_required' });
}

module.exports = { loadSessionMiddleware, requireAuth, requireStepUp };