Middleware i uwierzytelnianie
Dodawanie logiki przekrojowej i ochrona tras.
Middleware i uwierzytelnianie to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.
Czym jest middleware?
Middleware znajduje się między przychodzącym żądaniem a handlerem trasy i może analizować lub modyfikować zarówno żądanie, jak i odpowiedź. Doskonale nadaje się do logowania, obsługi CORS, obsługi błędów i uwierzytelniania.
import VaporProtokół middleware
Niestandardowy middleware implementuje AsyncMiddleware i metodę respond(to:chainingTo:). Wykonajcie Państwo potrzebne operacje, a następnie wywołajcie next.respond(to:), aby kontynuować łańcuch.
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)
}
}Globalne rejestrowanie middleware
Dodajcie Państwo middleware do app.middleware, aby był uruchamiany dla każdego żądania. Kolejność ma znaczenie — middleware jest uruchamiany w kolejności, w jakiej został dodany.
app.middleware.use(LogMiddleware())Wbudowany middleware
Vapor zawiera przydatne elementy middleware: ErrorMiddleware przekształca zgłoszone błędy w odpowiedzi, FileMiddleware udostępnia pliki statyczne, a CORSMiddleware obsługuje żądania między źródłami.
let cors = CORSMiddleware(configuration: .default())
app.middleware.use(cors)Middleware dla wybranych tras
Zastosujcie Państwo middleware tylko do niektórych tras, grupując je razem. Trasy wewnątrz grupy będą chronione, a pozostałe nie.
let protected = app.grouped(LogMiddleware())
protected.get("dashboard") { req in "Secret dashboard" }Podstawowe pojęcia uwierzytelniania
System uwierzytelniania Vapor składa się z dwóch części: modelu Authenticatable (użytkownika) oraz middleware Authenticator, który weryfikuje dane uwierzytelniające i zapisuje użytkownika w żądaniu.
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() {}
}Pisanie podstawowego authenticatora
AsyncBasicAuthenticator obsługuje uwierzytelnianie HTTP Basic. Zaimplementujcie Państwo authenticate(basic:for:): wyszukajcie użytkownika, zweryfikujcie hasło i po pomyślnym uwierzytelnieniu wywołajcie 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)
}
}
}Haszowanie haseł za pomocą Bcrypt
Nigdy nie przechowujcie Państwo haseł w postaci jawnej. Vapor zawiera Bcrypt, który służy do haszowania haseł podczas rejestracji i weryfikowania ich podczas logowania. Haszowanie jest jednokierunkowe — weryfikacja porównuje podane hasło z zapisanym haszem.
let hash = try Bcrypt.hash("s3cret")
let ok = try Bcrypt.verify("s3cret", created: hash) // trueOchrona tras za pomocą guarda
Połączcie Państwo authenticator z AppUser.guardMiddleware(), który odrzuca nieuwierzytelnione żądania, zwracając status 401. Umieśćcie chronione trasy w grupie zabezpieczonej przez oba elementy.
let protected = app.grouped(
UserAuthenticator(),
AppUser.guardMiddleware()
)
protected.get("me") { req -> String in
let user = try req.auth.require(AppUser.self)
return user.username
}Odczytywanie uwierzytelnionego użytkownika
W chronionym handlerze należy pobrać zalogowanego użytkownika za pomocą req.auth.require(_:) (zgłasza błąd, jeśli użytkownik nie istnieje) lub req.auth.get(_:) (zwraca wartość opcjonalną). W ten sposób można ograniczyć dane do bieżącego użytkownika.
app.get("profile") { req -> String in
let user = try req.auth.require(AppUser.self)
return "Hello, " + user.username
}Uwierzytelnianie tokenem
W przypadku API często używa się tokenów typu bearer. Model tokenu jest zgodny z ModelTokenAuthenticatable, dzięki czemu Vapor może zweryfikować nagłówek Authorization: Bearer ... i automatycznie wczytać powiązanego użytkownika.
let tokenProtected = app.grouped(
UserToken.authenticator(),
AppUser.guardMiddleware()
)Szybkie sprawdzenie: middleware i uwierzytelnianie
Sprawdź swoją wiedzę.
Podsumowanie: middleware i uwierzytelnianie
Nauczono się przechwytywać żądania i je zabezpieczać:
- Middleware (
AsyncMiddleware) opakowuje żądania; można go zarejestrować globalnie lub dla grupy tras. - Należy używać wbudowanych elementów, takich jak
ErrorMiddlewareiCORSMiddleware. - Należy sprawić, aby użytkownik był
Authenticatable, napisaćAuthenticatori wywołaćreq.auth.login. - Należy haszować dane za pomocą
Bcrypt, chronić trasy przezguardMiddleware()i odczytywać użytkownika za pomocąreq.auth.require.
Często zadawane pytania
Czy lekcja „Middleware i uwierzytelnianie” jest bezpłatna?
Tak — pełny tekst „Middleware i uwierzytelnianie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Middleware i uwierzytelnianie”?
Dodawanie logiki przekrojowej i ochrona tras. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Swift Academy?
Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Middleware i uwierzytelnianie”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?
Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Routing i obsługa żądań
- Kodowanie treści i JSON
- Fluent ORM i modele
- Middleware i uwierzytelnianie