🔍
JWT Authentication
Complete JWT auth with refresh tokens
jwtauthexpress
1const jwt = require('jsonwebtoken');
2const bcrypt = require('bcryptjs');
3
4// Generate tokens
5const generateTokens = (userId) => {
6 const accessToken = jwt.sign(
7 { userId, type: 'access' },
8 process.env.JWT_SECRET,
9 { expiresIn: '15m' }
10 );
11 const refreshToken = jwt.sign(
12 { userId, type: 'refresh' },
13 process.env.JWT_REFRESH_SECRET,
14 { expiresIn: '7d' }
15 );
16 return { accessToken, refreshToken };
17};
18
19// Middleware to verify JWT
20const authenticateToken = (req, res, next) => {
21 const authHeader = req.headers['authorization'];
22 const token = authHeader?.split(' ')[1];
23 if (!token) return res.status(401).json({ error: 'No token provided' });
24 try {
25 const decoded = jwt.verify(token, process.env.JWT_SECRET);
26 req.user = decoded;
27 next();
28 } catch (err) {
29 if (err.name === 'TokenExpiredError') {
30 return res.status(401).json({ error: 'Token expired' });
31 }
32 res.status(403).json({ error: 'Invalid token' });
33 }
34};
35
36// Login route
37app.post('/auth/login', async (req, res) => {
38 const { email, password } = req.body;
39 const user = await User.findOne({ email });
40 if (!user || !await bcrypt.compare(password, user.password)) {
41 return res.status(401).json({ error: 'Invalid credentials' });
42 }
43 const tokens = generateTokens(user._id);
44 res.json(tokens);
45});