Files
noteflow/routes/auth.routes.js
T
2025-11-06 13:23:48 +01:00

67 lines
2.0 KiB
JavaScript

const express = require('express');
const router = express.Router();
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const { body, validationResult } = require('express-validator');
const rateLimit = require('express-rate-limit');
const { db, logger } = require('../config/database');
const { authMiddleware } = require('../middleware/auth');
// Rate limiting
const loginLimiter = rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 10, // 10 requests per minute
message: { message: 'Too many login attempts, please try again later' }
});
// Login validation
const loginValidation = [
body('username').trim().notEmpty().escape(),
body('password').trim().notEmpty()
];
// Login route
router.post('/login', loginLimiter, loginValidation, async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const { username, password } = req.body;
db.get('SELECT * FROM users WHERE username = ?', [username], async (err, user) => {
if (err) {
logger.error('Login error:', err);
return res.status(500).json({ message: 'Server error' });
}
if (!user) {
return res.status(401).json({ message: 'Invalid credentials' });
}
const validPassword = await bcrypt.compare(password, user.password_hash);
if (!validPassword) {
return res.status(401).json({ message: 'Invalid credentials' });
}
const token = jwt.sign(
{ id: user.id, username: user.username, is_admin: user.is_admin },
process.env.JWT_SECRET,
{ expiresIn: '24h' }
);
res.json({ token, user: { id: user.id, username: user.username, is_admin: user.is_admin } });
});
});
// Get current user
router.get('/me', authMiddleware, (req, res) => {
res.json(req.user);
});
// Logout (client-side only, just for completeness)
router.post('/logout', (req, res) => {
res.json({ message: 'Logged out successfully' });
});
module.exports = router;