const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); const JWT_SECRET = process.env.JWT_SECRET || 'dev-secret-change-me-please'; const COOKIE_NAME = 'sudoku_token'; const TOKEN_TTL = '30d'; const COOKIE_MAX_AGE = 30 * 24 * 60 * 60 * 1000; function hashPassword(password) { return bcrypt.hashSync(password, 10); } function verifyPassword(password, hash) { return bcrypt.compareSync(password, hash); } function signToken(user) { return jwt.sign({ id: user.id, pseudo: user.pseudo }, JWT_SECRET, { expiresIn: TOKEN_TTL }); } function setAuthCookie(res, token) { res.cookie(COOKIE_NAME, token, { httpOnly: true, sameSite: 'lax', secure: false, maxAge: COOKIE_MAX_AGE, }); } function clearAuthCookie(res) { res.clearCookie(COOKIE_NAME); } function authMiddleware(req, res, next) { const token = req.cookies ? req.cookies[COOKIE_NAME] : null; req.user = null; if (token) { try { req.user = jwt.verify(token, JWT_SECRET); } catch (e) { req.user = null; } } next(); } function requireAuth(req, res, next) { if (!req.user) return res.status(401).json({ error: 'AUTH_REQUIRED' }); next(); } module.exports = { hashPassword, verifyPassword, signToken, setAuthCookie, clearAuthCookie, authMiddleware, requireAuth, };