← Назад к вопросам

В чем разница между аутентификацией и авторизацией?

1.0 Junior🔥 171 комментариев
#API тестирование#Теория тестирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Аутентификация vs Авторизация

Определение

Аутентификация (Authentication) — проверка личности пользователя (who are you?)

Авторизация (Authorization) — проверка прав доступа (what can you do?)

Аутентификация

Процесс:

  1. Пользователь предоставляет учетные данные (логин, пароль)
  2. Система проверяет, верны ли данные
  3. Если верны — пользователь подтвержден (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

Авторизация

Процесс:

  1. После успешной аутентификации
  2. Система проверяет права пользователя
  3. Разрешает или запрещает доступ к ресурсам

Методы:

  • 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 Unauthorized403 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

  1. Храни пароли хешированными
from werkzeug.security import generate_password_hash, check_password_hash

hashed = generate_password_hash(password)
if check_password_hash(hashed, password):
    # Пароль верный
    pass
  1. Используй HTTPS для передачи учетных данных

  2. Не храни токены в URL

  3. Используй JWT для безстационных токенов

  4. Регулярно проверяй логи на подозрительную активность

Для QA тестирования: 401 ошибка означает проблему с аутентификацией, 403 означает проблему с авторизацией.

В чем разница между аутентификацией и авторизацией? | PrepBro