Ответ
Это три последовательных этапа в процессе управления доступом, которые часто путают.
Идентификация (Identification): Процесс, в котором пользователь заявляет, кто он. Это ответ на вопрос: «Кто вы?»
- Пример: Ввод логина, email или номера телефона на сайте.
Аутентификация (Authentication): Процесс проверки подлинности заявленной личности. Это ответ на вопрос: «Вы действительно тот, за кого себя выдаете?»
- Примеры: Ввод пароля, подтверждение по SMS, использование биометрии (отпечаток пальца), предъявление токена (JWT).
Авторизация (Authorization): Процесс предоставления или отказа в доступе к определенным ресурсам или действиям после успешной аутентификации. Это ответ на вопрос: «Что вам разрешено делать?»
- Примеры: Пользователь с ролью
user
может читать статьи, а пользователь с рольюadmin
может их редактировать и удалять.
- Примеры: Пользователь с ролью
Аналогия с аэропортом:
- Идентификация: Вы говорите на стойке регистрации: «Я Иван Иванов».
- Аутентификация: Вы предъявляете паспорт, чтобы доказать, что вы действительно Иван Иванов.
- Авторизация: Сотрудник проверяет ваш посадочный талон, чтобы убедиться, что у вас есть право сесть именно на этот рейс (а не на любой другой).
Пример в коде 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)
})
}