Промежуточное ПО и аутентификация
Добавляйте сквозную логику и защищайте маршруты.
«Промежуточное ПО и аутентификация» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Маршрутизация и обработка запросов
- Кодирование содержимого и JSON
- Fluent ORM и модели
- Промежуточное ПО и аутентификация