← back to Bertha

src/lib/auth.js

43 lines

const jwt = require('jsonwebtoken');
const cookie = require('cookie');

// Audit 2026-05-04: removed inline literal JWT_SECRET + VALID_PASS.
// Old values are now in source-control history; treat as compromised, rotate.
const JWT_SECRET = process.env.JWT_SECRET;
if (!JWT_SECRET) {
  throw new Error('JWT_SECRET env var required (no fallback for production safety)');
}
const VALID_USER = process.env.AUTH_USERNAME || 'admin';
const VALID_PASS = process.env.AUTH_PASSWORD;
if (!VALID_PASS) {
  throw new Error('AUTH_PASSWORD env var required (no fallback for production safety)');
}

function createToken(username) {
  return jwt.sign({ username, role: 'admin' }, JWT_SECRET, { expiresIn: '7d' });
}

function verifyToken(token) {
  try {
    return jwt.verify(token, JWT_SECRET);
  } catch {
    return null;
  }
}

function getTokenFromRequest(req) {
  const cookies = cookie.parse(req.headers.get?.('cookie') || req.headers?.cookie || '');
  if (cookies.bertha_token) return cookies.bertha_token;
  const auth = req.headers.get?.('authorization') || req.headers?.authorization || '';
  if (auth.startsWith('Bearer ')) return auth.slice(7);
  return null;
}

function authenticateRequest(req) {
  const token = getTokenFromRequest(req);
  if (!token) return null;
  return verifyToken(token);
}

module.exports = { createToken, verifyToken, authenticateRequest, VALID_USER, VALID_PASS, JWT_SECRET };