Авторизация и аутентификация в JavaScript (Node.js)
В современной веб-разработке безопасность пользовательских данных — приоритетная задача. В этом руководстве мы разберем ключевые концепции аутентификации (проверки подлинности) и авторизации (разграничения доступа) в среде Node.js. Вы узнаете, как реализовать регистрацию, вход по паролю, использование JWT-токенов и защиту маршрутов.
1. Основные понятия
- Аутентификация — процесс подтверждения личности (например, по email+пароль).
- Авторизация — проверка, имеет ли пользователь право на выполнение действия (роль admin/user).
- JWT (JSON Web Token) — компактный способ передачи данных в виде токена, часто используется для сессий.
- Хеширование паролей — обязательное требование безопасности (bcrypt, argon2).
2. Установка зависимостей
Для работы нам понадобятся следующие npm-пакеты:
npm install express bcryptjs jsonwebtoken dotenv
express— веб-фреймворкbcryptjs— хеширование паролейjsonwebtoken— создание и проверка JWTdotenv— управление секретными ключами
3. Простая регистрация и хеширование пароля
Создадим базовую модель пользователя (для примера используем массив в памяти, в реальном проекте замените на базу данных):
const bcrypt = require('bcryptjs');
const users = []; // имитация БД
async function registerUser(email, password) {
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(password, salt);
users.push({ email, password: hashedPassword });
console.log('Пользователь зарегистрирован:', email);
}
// Пример вызова:
registerUser('user@example.com', 'myPassword123');
4. Аутентификация с JWT
После успешного входа мы выдаём клиенту JWT токен. Токен содержит ID пользователя и срок действия.
const jwt = require('jsonwebtoken');
require('dotenv').config();
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
function loginUser(email, password) {
const user = users.find(u => u.email === email);
if (!user) return null;
const isValid = bcrypt.compareSync(password, user.password);
if (!isValid) return null;
// Создаём токен
const token = jwt.sign(
{ userId: user.email, role: 'user' },
JWT_SECRET,
{ expiresIn: '1h' }
);
return token;
}
5. Middleware для защиты маршрутов
Создадим промежуточное ПО (middleware), которое проверяет JWT в заголовке Authorization:
function authMiddleware(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
if (!token) {
return res.status(401).json({ message: 'Токен не предоставлен' });
}
try {
const decoded = jwt.verify(token, JWT_SECRET);
req.user = decoded; // передаём данные пользователя в запрос
next();
} catch (err) {
return res.status(403).json({ message: 'Недействительный токен' });
}
}
6. Пример использования в Express
Собираем всё вместе — создаём маршруты для входа и защищённого профиля:
const express = require('express');
const app = express();
app.use(express.json());
// Маршрут входа
app.post('/api/login', (req, res) => {
const { email, password } = req.body;
const token = loginUser(email, password);
if (!token) {
return res.status(401).json({ message: 'Неверные учетные данные' });
}
res.json({ token });
});
// Защищённый маршрут
app.get('/api/profile', authMiddleware, (req, res) => {
res.json({ message: 'Доступ разрешен', user: req.user });
});
app.listen(3000, () => console.log('Сервер запущен на порту 3000'));
7. Авторизация по ролям
Для разграничения прав создадим middleware, проверяющий роль пользователя:
function requireRole(role) {
return (req, res, next) => {
if (req.user.role !== role) {
return res.status(403).json({ message: 'Недостаточно прав' });
}
next();
};
}
// Использование:
app.delete('/api/admin/users', authMiddleware, requireRole('admin'), (req, Также в библиотеке
Cobra для Go: полное руководство с примерами
Работа с ZIP-архивами в Java: полное руководство по java.util.zip
better-sqlite3-typescript для TypeScript: полное руководство с примерами
Redis клиент для Kotlin: Lettuce и Kreds — сравнение и примеры
Rate Limiting в Rust: библиотеки для ограничения частоты запросов