Загрузка…
Загрузка…
Node.js · middle · сложность 4
Структура JWT:
header.payload.signature
закодировано в Base64URL
Процесс аутентификации:
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
// Login endpoint
app.post('/login', async (req, res) => {
const { email, password } = req.body;
// Verify user credentials
const user = await User.findOne({ email });
if (!user || !await bcrypt.compare(password, user.password)) {
return res.status(401).json({ error: 'Invalid credentials' });
}
// Create JWT
const payload = {
userId: user.id,
email: user.email,
role: user.role
};
const token = jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: '1h',
issuer: 'myapp.com',
audience: 'myapp-users'
});
res.json({ token, user: { id: user.id, email: user.email } });
});
// JWT verification middleware
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Token required' });
}
jwt.verify(token, process.env.JWT_SECRET, (err, decoded) => {
if (err) {
return res.status(403).json({ error: 'Invalid token' });
}
req.user = decoded;
next();
});
}Лучшие практики:
Безопасность:
Управление токенами:
// Refresh token pattern
const refreshTokens = new Set(); // Use Redis in production
app.post('/refresh', (req, res) => {
const { refreshToken } = req.body;
if (!refreshToken || !refreshTokens.has(refreshToken)) {
return res.status(403).json({ error: 'Invalid refresh token' });
}
jwt.verify(refreshToken, process.env.REFRESH_SECRET, (err, user) => {
if (err) return res.status(403).json({ error: 'Invalid refresh token' });
const accessToken = jwt.sign(
{ userId: user.userId, email: user.email },
process.env.JWT_SECRET,
{ expiresIn: '15m' }
);
res.json({ accessToken });
});
});
// Logout (blacklist token)
const blacklistedTokens = new Set(); // Use Redis in production
app.post('/logout', authenticateToken, (req, res) => {
const token = req.headers.authorization.split(' ')[1];
blacklistedTokens.add(token);
res.json({ message: 'Logged out successfully' });
});Распространенные ошибки:
Расширенные шаблоны:
Ключевой вывод для интервью: как работает аутентификация на основе JWT и каковы лучшие практики ее использования?