61 lines
1.3 KiB
JavaScript
61 lines
1.3 KiB
JavaScript
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,
|
|
};
|