Авторизация и аутентификация в JavaScript (Node.js): полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Авторизация и аутентификация в 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 — создание и проверка JWT
  • dotenv — управление секретными ключами

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,                    

Рекомендаций