mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
67 lines
2.0 KiB
JavaScript
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; |