← Назад к вопросам
В чем разница между аутентификацией и авторизацией?
1.0 Junior🔥 171 комментариев
#API тестирование#Теория тестирования
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Аутентификация vs Авторизация
Определение
Аутентификация (Authentication) — проверка личности пользователя (who are you?)
Авторизация (Authorization) — проверка прав доступа (what can you do?)
Аутентификация
Процесс:
- Пользователь предоставляет учетные данные (логин, пароль)
- Система проверяет, верны ли данные
- Если верны — пользователь подтвержден (authenticated)
Методы:
- Username/Password
- Two-Factor Authentication (2FA)
- Biometric (отпечатки, лицо)
- OAuth, OpenID Connect
- API Keys, Tokens
Примеры:
import hashlib
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
# Поиск пользователя в БД
user = User.query.filter_by(username=username).first()
if user and user.check_password(password):
# Аутентификация успешна
session['user_id'] = user.id
return "Login successful", 200
else:
# Аутентификация не пройдена
return "Invalid credentials", 401 # Unauthorized
Авторизация
Процесс:
- После успешной аутентификации
- Система проверяет права пользователя
- Разрешает или запрещает доступ к ресурсам
Методы:
- Role-Based Access Control (RBAC)
- Attribute-Based Access Control (ABAC)
- Access Control List (ACL)
Примеры:
from functools import wraps
from flask import session, abort
def require_admin(f):
@wraps(f)
def decorated_function(*args, **kwargs):
user_id = session.get('user_id')
user = User.query.get(user_id)
# Авторизация — проверка прав
if not user or user.role != 'admin':
abort(403) # Forbidden
return f(*args, **kwargs)
return decorated_function
@app.route('/admin/users')
@require_admin
def admin_panel():
return "Welcome admin"
Визуальная аналогия
Боротебель в клубе:
Аутентификация (Authentication):
- Вы показываете паспорт охранику
- Охранник проверяет, что это вы
- Вас пускают внутрь
Авторизация (Authorization):
- Вы хотите попасть в VIP зону
- Охранник проверяет ваш браслет
- Если браслет есть, вас пускают
- Если нет — не пускают
Сравнение
| Характеристика | Аутентификация | Авторизация |
|---|---|---|
| Вопрос | Кто ты? | Что ты можешь? |
| Когда | Вход в систему | После входа |
| Ошибка | 401 Unauthorized | 403 Forbidden |
| Переменность | Статична | Может меняться |
| Примеры | Логин, 2FA | Роли, права доступа |
HTTP статус коды
401 Unauthorized — аутентификация не пройдена
if not authenticated:
return "Login required", 401
403 Forbidden — аутентифицирован, но доступа нет
if not authorized:
return "Access denied", 403
Примеры в тестировании
import pytest
import requests
def test_authentication_failed():
"""Проверка, что неправильный логин не допускает доступ"""
response = requests.post(
"https://api.example.com/login",
json={"username": "john", "password": "wrong"}
)
assert response.status_code == 401
def test_authentication_success():
"""Проверка, что правильный логин допускает доступ"""
response = requests.post(
"https://api.example.com/login",
json={"username": "john", "password": "correct"}
)
assert response.status_code == 200
assert "token" in response.json()
def test_authorization_admin():
"""Проверка, что админ может удалять пользователей"""
# Логинимся как админ
login = requests.post(
"https://api.example.com/login",
json={"username": "admin", "password": "pass"}
)
token = login.json()["token"]
# Удаляем пользователя
response = requests.delete(
"https://api.example.com/users/1",
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 200
def test_authorization_user_cannot_delete():
"""Проверка, что обычный пользователь не может удалять"""
# Логинимся как обычный пользователь
login = requests.post(
"https://api.example.com/login",
json={"username": "user", "password": "pass"}
)
token = login.json()["token"]
# Пытаемся удалить пользователя
response = requests.delete(
"https://api.example.com/users/1",
headers={"Authorization": f"Bearer {token}"}
)
assert response.status_code == 403 # Forbidden
def test_no_token_unauthorized():
"""Проверка, что без токена доступ запрещен"""
response = requests.get(
"https://api.example.com/users"
)
assert response.status_code == 401 # Unauthorized
Практический пример OAuth 2.0
import requests
from requests.auth import OAuth2Session
# OAuth аутентификация
oauth = OAuth2Session(
client_id='client_id',
redirect_uri='https://app.example.com/callback'
)
# Получаем токен
token = oauth.fetch_token(
'https://provider.example.com/token',
client_secret='client_secret',
authorization_response='https://app.example.com/callback?code=...'
)
# Используем токен для авторизации
response = oauth.get(
'https://api.example.com/user',
headers={'Authorization': f'Bearer {token["access_token"]}'}
)
Best Practices
- Храни пароли хешированными
from werkzeug.security import generate_password_hash, check_password_hash
hashed = generate_password_hash(password)
if check_password_hash(hashed, password):
# Пароль верный
pass
-
Используй HTTPS для передачи учетных данных
-
Не храни токены в URL
-
Используй JWT для безстационных токенов
-
Регулярно проверяй логи на подозрительную активность
Для QA тестирования: 401 ошибка означает проблему с аутентификацией, 403 означает проблему с авторизацией.