Files
ToDo-App_Node.js_Test/middleware/authMiddleware.js
2025-04-06 15:27:27 +02:00

63 lines
2.3 KiB
JavaScript

// middleware/authMiddleware.js
// Middleware to protect routes by verifying JWT
const jwt = require('jsonwebtoken');
require('dotenv').config();
const JWT_SECRET = process.env.JWT_SECRET;
const authenticateToken = (req, res, next) => {
// Get token from the 'token' cookie
const token = req.cookies.token;
// Enhanced debug logging
console.log('Auth Request:', {
path: req.path,
method: req.method,
contentType: req.headers['content-type'],
accept: req.headers.accept,
hasToken: !!token, // Log if token exists (true/false)
cookies: Object.keys(req.cookies) // Log all cookie names
});
// More precise API request detection - already good
const isApiRequest = req.path.startsWith('/api/') ||
req.xhr ||
(req.headers['content-type'] && req.headers['content-type'].includes('application/json')) ||
(req.headers.accept && req.headers.accept.includes('application/json'));
// If no token is present, deny access
if (!token) {
console.log('No token found, request is API?', isApiRequest);
// If the request is for an API endpoint, return 401 Unauthorized
if (isApiRequest) {
return res.status(401).json({ message: 'Zugriff verweigert. Nicht authentifiziert.' });
}
// Otherwise, redirect to the login page
return res.redirect('/login');
}
// Verify the token with better error reporting
jwt.verify(token, JWT_SECRET, (err, user) => {
if (err) {
console.error('JWT Verification Error:', err.message, err.name);
// If token is invalid or expired
if (isApiRequest) {
// Clear the invalid cookie and return 403 Forbidden for API requests
res.clearCookie('token');
return res.status(403).json({ message: 'Token ungültig oder abgelaufen.' });
}
// Clear the invalid cookie and redirect to login for page requests
res.clearCookie('token');
return res.redirect('/login');
}
// If token is valid, attach the decoded user information (payload) to the request object
req.user = user;
// Add debug logging for successful auth
console.log('Authentication successful for user:', user.username, 'user ID:', user.id);
next();
});
};
module.exports = authenticateToken;