0Pricing
Learn Rust Coding · Урок

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

Реализуйте безопасную аутентификацию пользователей (например, с помощью 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): доступ предоставляется на основании атрибутов пользователя, ресурса или окружения.

Концепция промежуточного программного обеспечения для авторизации

В веб-сервисе авторизация часто обрабатывается с помощью промежуточного программного обеспечения. Это код, который выполняется до основного обработчика маршрута.

Промежуточное программное обеспечение должно:

  1. Извлечь удостоверение личности аутентифицированного пользователя (например, из JWT).
  2. Сопоставить его роли или разрешения с требуемым уровнем доступа к запрошенной конечной точке.
  3. Если доступ разрешён, позволить запросу продолжить выполнение; в противном случае вернуть ошибку «Не авторизован» или «Доступ запрещён».

Это позволяет сохранить обработчики маршрутов чистыми и сосредоточенными на бизнес-логике.

Проверьте свои знания

Давайте быстро проверим, насколько хорошо вы понимаете аутентификацию и авторизацию.

Повторение: защита веб-сервисов

Отличная работа! В этом уроке вы изучили основы защиты веб-сервисов на 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 — локальная установка не требуется.

Все уроки этого курса

  1. REST API с Actix-web/Rocket
  2. Интеграция с базами данных (SQLx/Diesel)
  3. Аутентификация и авторизация
← Назад к Learn Rust Coding