Ответ
Да, JWT — стандартный подход для аутентификации в моих Node.js приложениях. Использую библиотеку jsonwebtoken вместе с bcrypt для хеширования паролей.
Полный flow аутентификации:
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
// 1. Регистрация пользователя
async function register(email, password) {
const hashedPassword = await bcrypt.hash(password, 10);
const user = await User.create({ email, password: hashedPassword });
return user;
}
// 2. Логин и выдача токенов
async function login(email, password) {
const user = await User.findOne({ email });
if (!user) throw new Error('User not found');
const isValid = await bcrypt.compare(password, user.password);
if (!isValid) throw new Error('Invalid password');
// Access token (короткоживущий)
const accessToken = jwt.sign(
{ userId: user.id, role: user.role },
process.env.JWT_ACCESS_SECRET,
{ expiresIn: '15m' }
);
// Refresh token (долгоживущий, хранится в БД)
const refreshToken = jwt.sign(
{ userId: user.id },
process.env.JWT_REFRESH_SECRET,
{ expiresIn: '7d' }
);
await RefreshToken.create({ token: refreshToken, userId: user.id });
return { accessToken, refreshToken };
}
// 3. Middleware для проверки токена
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, process.env.JWT_ACCESS_SECRET, (err, user) => {
if (err) return res.sendStatus(403);
req.user = user;
next();
});
}
Безопасность, которую я реализовывал:
- Хранение секретов в environment variables
- Использование разных секретов для access и refresh токенов
- Регулярная ротация refresh токенов и blacklist
- Добавление custom claims для ролевой модели
- Валидация issuer и audience в продакшене
Для микросервисной архитектуры использовал JWT для межсервисной аутентификации, подписывая токены центральным auth-сервисом.