-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauth.js
More file actions
38 lines (32 loc) · 1.09 KB
/
Copy pathauth.js
File metadata and controls
38 lines (32 loc) · 1.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const jwt = require('jsonwebtoken');
const { userQueries } = require('./db');
const SECRET = process.env.JWT_SECRET || 'dev-secret-change-me';
function signToken(user) {
return jwt.sign({ id: user.id, username: user.username }, SECRET, { expiresIn: '30d' });
}
function verifyToken(token) {
return jwt.verify(token, SECRET);
}
// Express middleware
function authRequired(req, res, next) {
const header = req.headers.authorization;
if (!header || !header.startsWith('Bearer ')) {
return res.status(401).json({ error: 'Authentication required' });
}
try {
const payload = verifyToken(header.slice(7));
const user = userQueries.findById.get(payload.id);
if (!user) return res.status(401).json({ error: 'User not found' });
req.user = user;
next();
} catch {
return res.status(401).json({ error: 'Invalid or expired token' });
}
}
function adminOnly(req, res, next) {
if (!req.user || req.user.role !== 'admin') {
return res.status(403).json({ error: 'Admin access required' });
}
next();
}
module.exports = { signToken, verifyToken, authRequired, adminOnly };