Аутентификация и авторизация
Реализуйте безопасную аутентификацию пользователей (например, с помощью JWT) и механизмы авторизации для защиты конечных точек веб-сервиса.
«Аутентификация и авторизация» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 3 уроков всего.
Защита веб-сервисов
Добро пожаловать! В этом уроке мы подробно рассмотрим аутентификацию и авторизацию — важнейшие понятия для создания безопасных веб-сервисов на Rust.
Вы научитесь защищать конечные точки API, проверяя, что доступ к ним получают только настоящие пользователи и только при наличии соответствующих разрешений.
Аутентификация и авторизация
Эти два термина звучат похоже, но означают разные вещи:
- Аутентификация: подтверждает, кто Вы. Это похоже на предъявление удостоверения личности при входе в здание.
- Авторизация: определяет, что Вам разрешено делать. После входа речь идёт о том, в какие помещения Вы можете пройти.
Мы реализуем оба механизма, чтобы защитить наши веб-сервисы на Rust.
Зачем защищать API?
Защита конечных точек API жизненно важна по нескольким причинам:
- Конфиденциальность данных: защищайте конфиденциальные данные пользователей от несанкционированного доступа.
- Целостность системы: не позволяйте злоумышленникам изменять или повреждать ваши данные.
- Соблюдение требований: выполняйте требования законодательства и нормативных актов (например, GDPR, HIPAA).
Надёжный уровень безопасности укрепляет доверие и защищает ваше приложение.
JSON Web Tokens (JWT)
Популярный способ аутентификации в современных веб-сервисах — использование JSON Web Tokens (JWT), произносится как «джот».
JWT — это компактный и безопасный для использования в URL способ представления утверждений, передаваемых между двумя сторонами. Их часто используют для аутентификации без хранения состояния.
Это означает, что серверу не нужно хранить информацию о сеансе для каждого пользователя.
Внутри JWT: заголовок, полезная нагрузка и подпись
JWT состоит из трёх частей, разделённых точками:
- Заголовок: содержит метаданные о token, например тип token (JWT) и алгоритм подписи (например, HS256).
- Полезная нагрузка: содержит «утверждения» — сведения о некоторой сущности (обычно пользователе) и дополнительные данные.
- Подпись: используется для проверки того, что token не был изменён. Она создаётся путём кодирования заголовка и полезной нагрузки с использованием секретного ключа.
Создание и проверка JWT в Rust
Давайте посмотрим, как создать и проверить JWT с помощью пакета jsonwebtoken в Rust. Помните, что в Cargo.toml необходимо добавить jsonwebtoken, serde (с возможностью «derive») и chrono (с возможностью «serde»).
Этот пример создаёт token, а затем сразу проверяет его.
use jsonwebtoken::{encode, decode, Header, EncodingKey, DecodingKey, Validation};
use serde::{Deserialize, Serialize};
use chrono::{Utc, Duration};
#[derive(Debug, Serialize, Deserialize)]
struct Claims {
sub: String, // Subject (user ID)
company: String,
exp: usize, // Expiration time
}
fn main() {
// --- Setup (requires crates: jsonwebtoken, serde, chrono) ---
let secret_key = "my_super_secret_key";
// --- 1. Generate a JWT ---
let my_claims = Claims {
sub: "user123".to_string(),
company: "CoddyKit".to_string(),
exp: (Utc::now() + Duration::minutes(10)).timestamp() as usize,
};
let token = encode(
&Header::default(),
&my_claims,
&EncodingKey::from_secret(secret_key.as_ref()),
).expect("Failed to encode token");
println!("Generated JWT:\n{}", token);
println!("\n--- Verifying the Token ---");
// --- 2. Verify the JWT ---
let validation = Validation::default();
let decoded_result = decode::<Claims>(
&token,
&DecodingKey::from_secret(secret_key.as_ref()),
&validation,
);
match decoded_result {
Ok(token_data) => {
println!("Token valid!");
println!("Subject: {}", token_data.claims.sub);
println!("Company: {}", token_data.claims.company);
},
Err(err) => println!("Token invalid: {:?}", err),
}
}Авторизация: определение доступа
После аутентификации пользователя (мы знаем, кто он) авторизация определяет, к каким ресурсам или действиям ему разрешён доступ.
Распространённые модели авторизации включают:
- Role-Based Access Control (RBAC): пользователям назначаются роли (например, «администратор», «редактор», «наблюдатель»), а для ролей определяются конкретные разрешения.
- Attribute-Based Access Control (ABAC): доступ предоставляется на основании атрибутов пользователя, ресурса или окружения.
Концепция промежуточного программного обеспечения для авторизации
В веб-сервисе авторизация часто обрабатывается с помощью промежуточного программного обеспечения. Это код, который выполняется до основного обработчика маршрута.
Промежуточное программное обеспечение должно:
- Извлечь удостоверение личности аутентифицированного пользователя (например, из JWT).
- Сопоставить его роли или разрешения с требуемым уровнем доступа к запрошенной конечной точке.
- Если доступ разрешён, позволить запросу продолжить выполнение; в противном случае вернуть ошибку «Не авторизован» или «Доступ запрещён».
Это позволяет сохранить обработчики маршрутов чистыми и сосредоточенными на бизнес-логике.
Проверьте свои знания
Давайте быстро проверим, насколько хорошо вы понимаете аутентификацию и авторизацию.
Повторение: защита веб-сервисов
Отличная работа! В этом уроке вы изучили основы защиты веб-сервисов на Rust:
- разницу между аутентификацией (кто вы) и авторизацией (что вы можете делать);
- важность защиты конечных точек API;
- принцип работы JSON Web Tokens (JWT) для аутентификации без хранения состояния, включая их структуру;
- практический пример создания и проверки JWT в Rust;
- концепцию Role-Based Access Control и использование промежуточного программного обеспечения для выполнения проверок авторизации.
Теперь вы готовы создавать более безопасные и надёжные приложения на Rust!
Часто задаваемые вопросы
Урок «Аутентификация и авторизация» бесплатный?
Да — полный текст урока «Аутентификация и авторизация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 3 уроков всего.
Чему я научусь в уроке «Аутентификация и авторизация»?
Реализуйте безопасную аутентификацию пользователей (например, с помощью JWT) и механизмы авторизации для защиты конечных точек веб-сервиса. Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn Rust Coding?
Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «Аутентификация и авторизация»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn Rust Coding?
Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- REST API с Actix-web/Rocket
- Интеграция с базами данных (SQLx/Diesel)
- Аутентификация и авторизация