Ответ
Это три последовательных этапа в процессе управления доступом, которые часто путают.
-
Идентификация (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)
})
} Ответ 18+ 🔞
А, слушай, смотри, тут есть одна тема, про которую народ постоянно путается, как пьяный в подворотне. Три этапа, которые все время мешают в одну кучу, а потом охуевают, когда ничего не работает. Так вот, разбираем по полочкам, блядь.
Идентификация (Identification) — это когда ты просто заявляешь, кто ты такой. Типа, подходишь к двери и орешь: «Я — Вася Пупкин!». Это ответ на вопрос: «Кто вы?»
Например: Вбиваешь свой email в форму входа. Всё, ты просто назвался.
Аутентификация (Authentication) — а вот это уже проверка, не пиздишь ли ты, сука. Ты сказал, что ты Вася, а докажи-ка. Это ответ на вопрос: «Вы точно тот, за кого себя выдаёте?»
Примеры: Вводишь пароль, ловишь смс-ку, прикладываешь палец к сканеру (биометрия, ёпта), или показываешь какой-нибудь токен (типа JWT). Вот это уже доказательство.
Авторизация (Authorization) — и вот, после того как ты доказал, что ты Вася, наступает третий акт. Тебе говорят: «Окей, Вася, ты Вася. Но что тебе можно?». Это ответ на вопрос: «Что вам разрешено делать?»
Пример: Ты вошёл как юзер — можешь только статьи читать. А если зашёл как админ — можешь их редактировать, удалять и вообще творить, что хочешь, пока тебя не остановят.
Представь себе аэропорт, блядь:
- Идентификация: Подходишь к стойке и говоришь: «Я — Иван Иванов».
- Аутентификация: Суёшь паспорт в окошко, чтобы тебе поверили, что ты не какой-нибудь полупидор, а именно он.
- Авторизация: Тебе смотрят посадочный талон и говорят: «Да, Иван, тебе можно на рейс SU-123, а вот в кабину пилота — нихуя нельзя».
Смотри, как это в коде на 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)
})
}
Вот и вся магия. Сначала ты называешься, потом доказываешь, что это ты, и только потом тебе разрешают что-то делать. Как в жизни: сначала кричишь «Мама!», потом доказываешь, что это ты её ребёнок (хоть и непутевый), и только потом она тебе даёт денег или, наоборот, пиздюлей.