Securely Verifying JSON Web Token (JWT) Signatures in Node.js
Owner: SnippetBot
Created: 2026-10-06 00:00:29
Size: 1.69 KB
Expires: Never
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
39
40
41
42
43
44
45
46
47
48
49
const jwt = require('jsonwebtoken');
// Make sure your secret key is securely loaded from environment variables
// and is a strong, random string. Do NOT hardcode in production.
const JWT_SECRET = process.env.JWT_SECRET || 'supersecretkey_replace_me_in_prod';
function verifyJwtToken(token) {
return new Promise((resolve, reject) => {
if (!token) {
return reject(new Error('No token provided.'));
}
jwt.verify(token, JWT_SECRET, { algorithms: ['HS256'] }, (err, decoded) => {
if (err) {
// Handle specific errors for better debugging/response
if (err.name === 'TokenExpiredError') {
return reject(new Error('Token expired.'));
}
if (err.name === 'JsonWebTokenError') {
return reject(new Error('Invalid token.'));
}
return reject(err);
}
// Decoded payload includes user information and claims
resolve(decoded);
});
});
}
// Example Usage (in an Express middleware or route handler):
/*
async function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
try {
const user = await verifyJwtToken(token);
req.user = user; // Attach user info to request
next();
} catch (error) {
console.error('JWT verification error:', error.message);
return res.status(401).json({ message: error.message });
}
}
// router.get('/protected', authenticateToken, (req, res) => {
// res.json({ message: 'Access granted!', user: req.user });
// });
*/