tududi/backend/middleware/csrf.js
Chris Veleris a89f2b72d9 fix: exempt public unauthenticated endpoints from CSRF protection
The lusca CSRF implementation was breaking login and registration because
the frontend doesn't fetch or send CSRF tokens. This is a structural issue
that requires frontend implementation.

As a pragmatic fix, this commit exempts public unauthenticated endpoints
from CSRF protection:
- /api/login, /api/register, /api/verify-email
- /api/version, /api/registration-status, /api/health
- /api/oidc/* (all OIDC authentication endpoints)
- /api/feature-flags

Authenticated endpoints still require CSRF tokens via lusca.

Also updates csrf.js to use lusca's token generation mechanism, making
it compatible with the global lusca CSRF middleware.

TODO: Implement proper CSRF token handling in the frontend for enhanced
security on public endpoints.
2026-04-13 13:05:33 +03:00

46 lines
949 B
JavaScript

const lusca = require('lusca');
const csrfMiddleware = (req, res, next) => {
if (!req.session) {
return res.status(500).json({ error: 'Session not initialized' });
}
if (!req.session._csrf) {
req.session._csrf = require('crypto').randomBytes(16).toString('hex');
}
next();
};
const csrfProtection = (req, res, next) => {
if (
process.env.NODE_ENV === 'test' ||
req.user ||
req.headers.authorization?.startsWith('Bearer ')
) {
return next();
}
return lusca.csrf({
header: 'x-csrf-token',
cookie: false,
})(req, res, next);
};
const generateToken = (req) => {
if (!req.session) {
return '';
}
if (!req.session._csrf) {
req.session._csrf = require('crypto').randomBytes(16).toString('hex');
}
return req.session._csrf;
};
module.exports = {
csrfProtection,
csrfMiddleware,
generateToken,
};