0Pricing
Swift Academy · Урок

Промежуточное ПО и аутентификация

Добавляйте сквозную логику и защищайте маршруты.

«Промежуточное ПО и аутентификация» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Что такое промежуточный обработчик

Промежуточный обработчик находится между входящим запросом и обработчиком маршрута и может проверять или изменять как запрос, так и ответ. Он отлично подходит для ведения журнала, CORS, обработки ошибок и аутентификации.

import Vapor

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

Пользовательский промежуточный обработчик соответствует AsyncMiddleware и реализует respond(to:chainingTo:). Выполните необходимые действия, затем вызовите next.respond(to:), чтобы продолжить цепочку.

struct LogMiddleware: AsyncMiddleware {
    func respond(to req: Request, chainingTo next: AsyncResponder) async throws -> Response {
        req.logger.info("Incoming: " + req.url.path)
        return try await next.respond(to: req)
    }
}

Глобальная регистрация промежуточного обработчика

Добавьте промежуточный обработчик в app.middleware, чтобы он выполнялся для каждого запроса. Порядок важен: промежуточные обработчики выполняются в порядке добавления.

app.middleware.use(LogMiddleware())

Встроенные промежуточные обработчики

Vapor поставляется с полезными промежуточными обработчиками: ErrorMiddleware преобразует выброшенные ошибки в ответы, FileMiddleware обслуживает статические файлы, а CORSMiddleware обрабатывает междоменные запросы.

let cors = CORSMiddleware(configuration: .default())
app.middleware.use(cors)

Промежуточный обработчик для отдельных маршрутов

Применяйте промежуточный обработчик только к некоторым маршрутам, объединив их в группу вместе с ним. Маршруты внутри группы будут защищены, а остальные — нет.

let protected = app.grouped(LogMiddleware())
protected.get("dashboard") { req in "Secret dashboard" }

Основы аутентификации

Система аутентификации Vapor состоит из двух частей: аутентифицируемой модели (Вашего пользователя) и промежуточного обработчика аутентификации, который проверяет учётные данные и сохраняет пользователя в запросе.

final class AppUser: Model, Content, Authenticatable {
    static let schema = "users"
    @ID(key: .id) var id: UUID?
    @Field(key: "username") var username: String
    @Field(key: "password_hash") var passwordHash: String
    init() {}
}

Создание базового аутентификатора

AsyncBasicAuthenticator обрабатывает базовую аутентификацию HTTP. Реализуйте authenticate(basic:for:): найдите пользователя, проверьте пароль и при успешной проверке вызовите req.auth.login(user).

struct UserAuthenticator: AsyncBasicAuthenticator {
    func authenticate(basic: BasicAuthorization, for req: Request) async throws {
        guard let user = try await AppUser.query(on: req.db)
            .filter(\.$username == basic.username).first() else { return }
        if try Bcrypt.verify(basic.password, created: user.passwordHash) {
            req.auth.login(user)
        }
    }
}

Хеширование паролей с помощью Bcrypt

Никогда не храните пароли в открытом виде. Vapor включает Bcrypt для хеширования при регистрации и проверки при login. Хеширование одностороннее: проверка сопоставляет введённый пароль с сохранённым хешем.

let hash = try Bcrypt.hash("s3cret")
let ok = try Bcrypt.verify("s3cret", created: hash) // true

Защита маршрутов с помощью защитного обработчика

Объедините аутентификатор с AppUser.guardMiddleware(), который отклоняет неаутентифицированные запросы с кодом 401. Объедините защищённые маршруты в группу, применив оба компонента.

let protected = app.grouped(
    UserAuthenticator(),
    AppUser.guardMiddleware()
)
protected.get("me") { req -> String in
    let user = try req.auth.require(AppUser.self)
    return user.username
}

Чтение аутентифицированного пользователя

В защищённом обработчике получите вошедшего в систему пользователя с помощью req.auth.require(_:) (вызывает исключение, если пользователь отсутствует) или req.auth.get(_:) (возвращает необязательное значение). Так вы ограничите данные текущим пользователем.

app.get("profile") { req -> String in
    let user = try req.auth.require(AppUser.self)
    return "Hello, " + user.username
}

Аутентификация по токену

Для программных интерфейсов часто используют токены предъявителя. Модель токена соответствует ModelTokenAuthenticatable, что позволяет Vapor проверять заголовок Authorization: Bearer ... и автоматически загружать связанного пользователя.

let tokenProtected = app.grouped(
    UserToken.authenticator(),
    AppUser.guardMiddleware()
)

Быстрая проверка: промежуточное ПО и аутентификация

Проверьте, насколько хорошо вы усвоили материал.

Итоги: промежуточное ПО и аутентификация

Вы научились перехватывать запросы и защищать их:

  • Промежуточное ПО (AsyncMiddleware) оборачивает запросы; его можно зарегистрировать глобально или для группы маршрутов.
  • Используйте встроенные компоненты, такие как ErrorMiddleware и CORSMiddleware.
  • Сделайте пользователя Authenticatable, напишите Authenticator и вызовите req.auth.login.
  • Хешируйте данные с помощью Bcrypt, защищайте маршруты с помощью guardMiddleware() и получайте пользователя через req.auth.require.

Часто задаваемые вопросы

Урок «Промежуточное ПО и аутентификация» бесплатный?

Да — полный текст урока «Промежуточное ПО и аутентификация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Промежуточное ПО и аутентификация»?

Добавляйте сквозную логику и защищайте маршруты. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Промежуточное ПО и аутентификация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Маршрутизация и обработка запросов
  2. Кодирование содержимого и JSON
  3. Fluent ORM и модели
  4. Промежуточное ПО и аутентификация
← Назад к Swift Academy