Загрузка...
Загрузка...
Аутентификация (Authentication) и Авторизация (Authorization) — это два разных, но взаимосвязанных процесса обеспечения безопасности в веб-приложениях.
Аутентификация — это процесс проверки личности пользователя. Система определяет, кто вы есть.
// Пример простой аутентификации
async function authenticate(email, password) {
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
});
if (response.ok) {
const { token } = await response.json();
// Сохраняем токен для последующих запросов
localStorage.setItem('authToken', token);
return true;
}
return false;
}
Авторизация — это процесс проверки прав доступа. Система определяет, что вам разрешено делать.
// Пример проверки прав доступа
function checkAuthorization(user, resource, action) {
// Проверяем роль пользователя
if (action === 'delete' && user.role !== 'admin') {
throw new Error('Недостаточно прав для удаления');
}
// Проверяем владение ресурсом
if (action === 'edit' && resource.ownerId !== user.id) {
throw new Error('Вы можете редактировать только свои ресурсы');
}
return true;
}
// Middleware для защиты роутов
function requireAdmin(req, res, next) {
if (req.user?.role !== 'admin') {
return res.status(403).json({ error: 'Доступ запрещен' });
}
next();
}
| Критерий | Аутентификация | Авторизация |
|---|---|---|
| Вопрос | "Кто вы?" | "Что вам можно?" |
| Цель | Проверить личность | Проверить права |
| Порядок | Первый шаг | Второй шаг |
| Данные | Логин, пароль, токен | Роли, права, политики |
| Результат | Вход выполнен / отклонен | Доступ разрешен / запрещен |
| HTTP статус | 401 Unauthorized | 403 Forbidden |
| Пример | Вход в систему | Доступ к админ-панели |
// 1. АУТЕНТИФИКАЦИЯ — проверяем, кто пользователь
app.post('/api/auth/login', async (req, res) => {
const { email, password } = req.body;
const user = await User.findOne({ email });
if (!user || !await user.comparePassword(password)) {
return res.status(401).json({ error: 'Неверные учетные данные' });
}
const token = generateJWT(user);
res.json({ token, user: { id: user.id, role: user.role } });
});
// 2. АВТОРИЗАЦИЯ — проверяем права доступа
app.delete('/api/posts/:id', authenticateToken, async (req, res) => {
const post = await Post.findById(req.params.id);
// Проверяем права: только автор или админ может удалить
if (post.authorId !== req.user.id && req.user.role !== 'admin') {
return res.status(403).json({ error: 'Недостаточно прав' });
}
await post.delete();
res.json({ success: true });
});
// Middleware для аутентификации
function authenticateToken(req, res, next) {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Требуется аутентификация' });
}
try {
req.user = verifyJWT(token);
next();
} catch (error) {
return res.status(401).json({ error: 'Недействительный токен' });
}
}
┌─────────────────┐
│ Пользователь │
└────────┬────────┘
│
▼
┌─────────────────────────┐
│ 1. АУТЕНТИФИКАЦИЯ │
│ "Кто вы?" │
│ Логин + Пароль │
└────────┬────────────────┘
│
▼
✓ Успешно
│
▼
┌─────────────────────────┐
│ 2. АВТОРИЗАЦИЯ │
│ "Что вам можно?" │
│ Проверка прав │
└────────┬────────────────┘
│
▼
✓ Доступ разрешен
│
▼
┌─────────────────────────┐
│ Доступ к ресурсу │
└─────────────────────────┘
// Пример 401
res.status(401).json({ error: 'Требуется вход в систему' });
// Пример 403
res.status(403).json({ error: 'Доступ запрещен' });