Объясните разницу между идентификацией, аутентификацией и авторизацией.

Ответ

Это три последовательных этапа в процессе управления доступом, которые часто путают.

  • Идентификация (Identification): Процесс, в котором пользователь заявляет, кто он. Это ответ на вопрос: «Кто вы?»

    • Пример: Ввод логина, email или номера телефона на сайте.
  • Аутентификация (Authentication): Процесс проверки подлинности заявленной личности. Это ответ на вопрос: «Вы действительно тот, за кого себя выдаете?»

    • Примеры: Ввод пароля, подтверждение по SMS, использование биометрии (отпечаток пальца), предъявление токена (JWT).
  • Авторизация (Authorization): Процесс предоставления или отказа в доступе к определенным ресурсам или действиям после успешной аутентификации. Это ответ на вопрос: «Что вам разрешено делать?»

    • Примеры: Пользователь с ролью user может читать статьи, а пользователь с ролью admin может их редактировать и удалять.

Аналогия с аэропортом:

  1. Идентификация: Вы говорите на стойке регистрации: «Я Иван Иванов».
  2. Аутентификация: Вы предъявляете паспорт, чтобы доказать, что вы действительно Иван Иванов.
  3. Авторизация: Сотрудник проверяет ваш посадочный талон, чтобы убедиться, что у вас есть право сесть именно на этот рейс (а не на любой другой).

Пример в коде Go (HTTP Middleware):

// Middleware для проверки аутентификации и авторизации
func AuthMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 1. Идентификация/Аутентификация
        tokenString := r.Header.Get("Authorization")
        if tokenString == "" {
            http.Error(w, "Отсутствует токен", http.StatusUnauthorized)
            return
        }

        // Проверяем токен (аутентификация)
        claims, err := validateToken(tokenString)
        if err != nil {
            http.Error(w, "Невалидный токен", http.StatusUnauthorized)
            return
        }

        // 2. Авторизация
        // Предположим, этот эндпоинт доступен только админам
        if claims.Role != "admin" {
            http.Error(w, "Доступ запрещен", http.StatusForbidden)
            return
        }

        // Если все проверки пройдены, передаем управление дальше
        next.ServeHTTP(w, r)
    })
}