В чем разница между аутентификацией и авторизацией?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между аутентификацией и авторизацией
Это два разных, но связанных между собой процесса, которые часто путают:
Аутентификация (Authentication) — это процесс идентификации личности. "Кто ты?" Подтверждение, что ты — действительно тот, за кого себя выдаёшь.
Авторизация (Authorization) — это процесс проверки прав. "Что ты можешь делать?" Определение, какие ресурсы и действия доступны аутентифицированному пользователю.
Аналогия с паспортом
┌─────────────────────────────────────────┐
│ Аутентификация: │
│ Проверка паспорта на пограничном │
│ контроле — подтверждение личности │
│ │
│ Результат: ✓ Ты — действительно Иван │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Авторизация: │
│ Проверка визы в паспорте — права на │
│ вход в страну и доступ к её ресурсам │
│ │
│ Результат: ✓ Иван может находиться в │
│ стране 30 дней, но не может работать │
└─────────────────────────────────────────┘
Пример в веб-приложении
Аутентификация: Пользователь вводит email и пароль в форму логина. Приложение:
- Проверяет, что пользователь с таким email существует в БД
- Хеширует введённый пароль и сравнивает с сохранённым хешем
- Если совпадает — пользователь подтвердил свою личность
- Выдаёт JWT токен или session cookie
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import HTTPBearer, HTTPAuthCredentials
import jwt
from datetime import datetime, timedelta
import bcrypt
app = FastAPI()
security = HTTPBearer()
# Функция для аутентификации (проверка логина/пароля)
async def authenticate_user(email: str, password: str):
# Поиск пользователя в БД
user = await db.users.find_one({"email": email})
if not user:
raise HTTPException(status_code=401, detail="Invalid credentials")
# Проверка пароля (аутентификация)
if not bcrypt.checkpw(password.encode(), user["password"]):
raise HTTPException(status_code=401, detail="Invalid credentials")
# Пользователь аутентифицирован ✓
return user
@app.post("/login")
async def login(email: str, password: str):
user = await authenticate_user(email, password)
# Генерируем JWT токен
token = jwt.encode(
{"user_id": str(user["_id"]), "exp": datetime.utcnow() + timedelta(hours=24)},
secret_key="your-secret"
)
return {"token": token}
Авторизация: Теперь у пользователя есть токен, но он может делать не всё. Авторизация определяет, какие именно действия разрешены.
# Функция для авторизации (проверка прав)
async def get_current_user(credentials: HTTPAuthCredentials = Depends(security)):
try:
payload = jwt.decode(
credentials.credentials,
secret_key="your-secret",
algorithms=["HS256"]
)
user_id = payload.get("user_id")
except jwt.ExpiredSignatureError:
raise HTTPException(status_code=401, detail="Token expired")
except jwt.InvalidTokenError:
raise HTTPException(status_code=401, detail="Invalid token")
user = await db.users.find_one({"_id": ObjectId(user_id)})
if not user:
raise HTTPException(status_code=401, detail="User not found")
# Пользователь аутентифицирован ✓
return user
# Авторизация — проверка ролей
async def require_admin(user = Depends(get_current_user)):
if user.get("role") != "admin":
raise HTTPException(status_code=403, detail="Admin access required")
return user
# Обычный пользователь может читать свой профиль
@app.get("/profile")
async def get_profile(user = Depends(get_current_user)):
return user
# Только админ может удалять пользователей
@app.delete("/users/{user_id}")
async def delete_user(user_id: str, admin = Depends(require_admin)):
await db.users.delete_one({"_id": ObjectId(user_id)})
return {"status": "deleted"}
Таблица сравнения
| Аспект | Аутентификация | Авторизация |
|---|---|---|
| Вопрос | Кто ты? | Что ты можешь? |
| Процесс | Проверка учётных данных | Проверка прав доступа |
| Примеры | Пароль, биометрия, 2FA | Роли, permissions, ACL |
| Результат | Токен, session | Доступ к ресурсам |
| Без этого | Невозможна авторизация | Чему-то может доступ получить кто-угодно |
Последовательность событий
Запрос от клиента:
┌──────────────────────────┐
│ POST /api/resource │
│ Authorization: Bearer X │
└──────────────────────────┘
↓
[Аутентификация]
✓ Токен валидный?
✓ Пользователь существует?
↓
[Авторизация]
✓ Пользователь имеет доступ к этому ресурсу?
✓ Роль позволяет POST операцию?
↓
┌──────────────────────────┐
│ 200 OK / 403 Forbidden │
└──────────────────────────┘
Типичные ошибки
# ❌ Неправильно: путают при реализации
@app.delete("/users/{id}")
async def delete_user(id: str):
# Нет проверки аутентификации вообще!
await db.users.delete_one({"_id": ObjectId(id)})
return {"deleted": True}
# ✅ Правильно: сначала аутентификация, потом авторизация
@app.delete("/users/{id}")
async def delete_user(id: str, admin = Depends(require_admin)):
# 1. Проверена аутентификация (в require_admin)
# 2. Проверена авторизация (админ ли?)
await db.users.delete_one({"_id": ObjectId(id)})
return {"deleted": True}
Итог
Аутентификация — это подтверждение личности (паспорт на границе), авторизация — это проверка прав (виза в паспорте). Сначала нужно знать кто попадает в систему, потом — что он может делать. Вместе они обеспечивают безопасность приложения.