В чем разница между идентификацией, аутентификацией и авторизацией?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Идентификация, Аутентификация, Авторизация
Эти три термина часто путают, но это различные этапы в цепочке контроля доступа. Давайте разберёмся на примере входа в офис или веб-приложение.
1. Идентификация (Identification)
Определение: Процесс, при котором система узнает, кто вы.
Это просто указание вашего ID/учетной записи, без проверки правильности.
Пример в офисе: Вы говорите охраннику "Я Иван Сидоров"
Пример в приложении: Вы вводите email ivan@example.com
# Идентификация - просто получили, кто это
email = request.json['email'] # ivan@example.com
print(f"Пользователь: {email}")
# На этом этапе мы НЕ знаем, действительно ли это Иван
Важно: Идентификация еще не подтверждает, что вы действительно тот, кем себя выдаёте.
2. Аутентификация (Authentication)
Определение: Процесс проверки вашей личности (подтверждение, что вы действительно тот, за кого себя выдаёте).
Это проверка доказательства (пароль, отпечаток пальца, токен).
Пример в офисе: Охранник просит показать пропуск или подтверждает вас по базе данных
Пример в приложении: Вы вводите пароль и система проверяет его правильность
from werkzeug.security import check_password_hash
# Аутентификация - проверяем, что это действительно Иван
email = request.json['email']
password = request.json['password']
# Ищем пользователя по email
user = db.query(User).filter_by(email=email).first()
if not user or not check_password_hash(user.password_hash, password):
return {'error': 'Invalid credentials'}, 401
# ✅ Аутентифицирован! Мы подтвердили личность
print(f"Пользователь {email} успешно аутентифицирован")
Методы аутентификации:
- Пароль (что вы знаете)
- Биометрия (кто вы есть)
- Аппаратные ключи (что вы имеете)
- SMS-код (что вы получили)
- Токены/JWT (что вам выдали)
3. Авторизация (Authorization)
Определение: Процесс определения, что вам разрешено делать после подтверждения личности.
Это проверка прав доступа и разрешений.
Пример в офисе: После проверки пропуска охранник говорит "Вы можете входить в офис, но не можете входить в серверную"
Пример в приложении: После входа система проверяет, может ли пользователь редактировать статью
from functools import wraps
from flask import abort
def require_admin(f):
"""Авторизация - проверяем права доступа"""
@wraps(f)
def decorated_function(*args, **kwargs):
# Сначала проверяем, аутентифицирован ли пользователь
user = get_current_user()
if not user:
return {'error': 'Unauthorized'}, 401
# Затем проверяем авторизацию (права)
if user.role != 'admin':
return {'error': 'Forbidden'}, 403 # Авторизован, но нет прав
return f(*args, **kwargs)
return decorated_function
@app.route('/admin/users', methods=['DELETE'])
@require_admin
def delete_user():
# Эта функция вызовется только если пользователь admin
user_id = request.json['user_id']
db.query(User).filter_by(id=user_id).delete()
return {'ok': True}
Сравнение в таблице
| Понятие | Что это | Ответ на вопрос | Пример |
|---|---|---|---|
| Идентификация | Указание вашего ID | Кто вы? | email: ivan@example.com |
| Аутентификация | Проверка пароля/подтверждение личности | Вы действительно Иван? | password check ✓ |
| Авторизация | Проверка прав доступа | Что вам разрешено делать? | role: admin ✓ |
Полный пример: вход в приложение
@app.route('/login', methods=['POST'])
def login():
# ШАГИ:
# 1️⃣ ИДЕНТИФИКАЦИЯ - указал email
email = request.json['email']
password = request.json['password']
# 2️⃣ АУТЕНТИФИКАЦИЯ - проверяем пароль
user = db.query(User).filter_by(email=email).first()
if not user or not check_password_hash(user.password_hash, password):
return {'error': 'Invalid email or password'}, 401
# ✅ Аутентификация успешна
session_token = generate_token(user.id)
response = jsonify({'ok': True, 'user_id': user.id})
response.set_cookie('session_token', session_token)
return response
@app.route('/profile')
def get_profile():
# Для доступа к этому маршруту нужно быть аутентифицирован
token = request.cookies.get('session_token')
if not token:
return {'error': 'Unauthorized'}, 401 # Не аутентифицирован
user_id = verify_token(token)
user = db.query(User).get(user_id)
# 3️⃣ АВТОРИЗАЦИЯ - проверяем права доступа
# Каждый пользователь может видеть только свой профиль
if user.id != get_current_user_id():
return {'error': 'Forbidden'}, 403 # Авторизация не пройдена
return {'user_id': user.id, 'email': user.email, 'role': user.role}
@app.route('/admin/dashboard')
def admin_dashboard():
# Для этого маршрута нужно быть admin
token = request.cookies.get('session_token')
user_id = verify_token(token)
if not user_id:
return {'error': 'Unauthorized'}, 401 # Не аутентифицирован
user = db.query(User).get(user_id)
# АВТОРИЗАЦИЯ - проверяем, что пользователь admin
if user.role != 'admin':
return {'error': 'Forbidden - only admin can access'}, 403
return {'dashboard': 'Admin data'}
HTTP коды ошибок
# 401 Unauthorized - проблема с АУТЕНТИФИКАЦИЕЙ
return {'error': 'Authentication failed'}, 401
# Случаи: нет токена, токен истек, неверный пароль
# 403 Forbidden - проблема с АВТОРИЗАЦИЕЙ
return {'error': 'You do not have permission'}, 403
# Случаи: вы авторизованы, но у вас нет прав на это действие
# 404 Not Found - ресурс не найден (иногда скрывают 403)
return {'error': 'Resource not found'}, 404
# Безопасность: не раскрываем информацию о существовании ресурса
Уровни авторизации (RBAC - Role Based Access Control)
class Permission:
READ = 'read'
CREATE = 'create'
UPDATE = 'update'
DELETE = 'delete'
class Role:
ADMIN = {
Permission.READ,
Permission.CREATE,
Permission.UPDATE,
Permission.DELETE
}
EDITOR = {
Permission.READ,
Permission.CREATE,
Permission.UPDATE
}
VIEWER = {
Permission.READ
}
def check_permission(user, required_permission):
"""Авторизация на уровне разрешений"""
if required_permission not in Role[user.role]:
raise ForbiddenError()
# Использование
@app.route('/articles/<id>', methods=['DELETE'])
def delete_article(id):
user = get_current_user()
check_permission(user, Permission.DELETE)
# Удаляем статью
Ключевые различия
- Идентификация = "Я говорю, кто я" → БЕЗ проверки
- Аутентификация = "Я доказываю, кто я" → С проверкой (пароль, биометрия)
- Авторизация = "Мне разрешено делать X" → Проверка прав
Аналогия с аэропортом:
- Идентификация: Вы показываете паспорт (вот кто я)
- Аутентификация: Таможенник проверяет паспорт (вы действительно тот, кто в паспорте)
- Авторизация: Вас пропускают только если у вас есть действительный билет (разрешение на полет)
Без правильного понимания этих различий легко создать уязвимое приложение.