Wtyczki uwierzytelniania: JWT i sesje
Zabezpieczaj trasy Ktor za pomocą tokenów JWT Bearer i uwierzytelniania opartego na sesjach.
Wtyczki uwierzytelniania: JWT i sesje to bezpłatna lekcja Kotlin 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 Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Przegląd uwierzytelniania w Ktorze
Wtyczka Authentication w Ktorze udostępnia ujednolicone API do ochrony tras. Konfigurujesz co najmniej jednego dostawcę (JWT, Session, Basic, OAuth itd.), a następnie umieszczasz trasy w bloku authenticate("providerName") { }.
Dodawanie zależności uwierzytelniania
Dodaj biblioteki uwierzytelniania i JWT do konfiguracji kompilacji:
dependencies {
implementation("io.ktor:ktor-server-auth:2.3.12")
implementation("io.ktor:ktor-server-auth-jwt:2.3.12")
implementation("io.ktor:ktor-server-sessions:2.3.12")
}Konfigurowanie uwierzytelniania JWT
Zainstaluj wtyczkę Authentication i skonfiguruj dostawcę JWT. Element verifier weryfikuje podpis tokenu, a validate wyodrębnia obiekt principal z ładunku:
install(Authentication) {
jwt("auth-jwt") {
realm = "ktor app"
verifier(
JWT.require(Algorithm.HMAC256(secret))
.withAudience(audience)
.withIssuer(issuer)
.build()
)
validate { credential ->
if (credential.payload.getClaim("username").asString() != null)
JWTPrincipal(credential.payload)
else null
}
}
}Ochrona tras za pomocą JWT
Umieść dowolną grupę tras w bloku authenticate("auth-jwt") { }. Nieuwierzytelnione żądania automatycznie otrzymają odpowiedź 401:
routing {
authenticate("auth-jwt") {
get("/protected") {
val principal = call.principal<JWTPrincipal>()!!
val username = principal.payload.getClaim("username").asString()
call.respondText("Hello, $username")
}
}
}Wystawianie tokenu JWT
Wygeneruj i podpisz token JWT w punkcie końcowym logowania za pomocą biblioteki java-jwt:
post("/login") {
val user = call.receive<LoginRequest>()
// validate credentials ...
val token = JWT.create()
.withAudience(audience)
.withIssuer(issuer)
.withClaim("username", user.username)
.withExpiresAt(Date(System.currentTimeMillis() + 3_600_000))
.sign(Algorithm.HMAC256(secret))
call.respond(mapOf("token" to token))
}Uwierzytelnianie oparte na sesjach
Sesje przechowują stan użytkownika po stronie serwera (lub po stronie klienta w postaci podpisanych plików cookie). Zainstaluj wtyczkę Sessions i zdefiniuj klasę danych sesji:
data class UserSession(val userId: Long, val username: String)
install(Sessions) {
cookie<UserSession>("user_session") {
cookie.path = "/"
cookie.httpOnly = true
}
}Konfigurowanie dostawcy uwierzytelniania sesji
Utwórz dostawcę uwierzytelniania sesji, który odczytuje sesję i zwraca obiekt principal:
install(Authentication) {
session<UserSession>("auth-session") {
validate { session -> session }
challenge { call.respond(HttpStatusCode.Unauthorized) }
}
}Ustawianie i czyszczenie sesji
Ustaw sesję po zalogowaniu za pomocą call.sessions.set(), a podczas wylogowania wyczyść ją za pomocą call.sessions.clear:
post("/login") {
val creds = call.receive<LoginRequest>()
// validate ...
call.sessions.set(UserSession(userId = 1L, username = creds.username))
call.respond(HttpStatusCode.OK)
}
post("/logout") {
call.sessions.clear<UserSession>()
call.respond(HttpStatusCode.OK)
}JWT a sesje: kiedy używać każdego z tych rozwiązań
JWT: bezstanowy, odpowiedni dla interfejsów API używanych przez klientów mobilnych i SPA. Token zawiera wszystkie dane uwierzytelniające, więc serwer nie potrzebuje magazynu sesji. Sesje: stanowe, odpowiednie dla aplikacji internetowych renderowanych po stronie serwera. Identyfikator sesji znajduje się w pliku cookie, a serwer przechowuje dane (w pamięci, Redisie lub bazie danych).
Łączenie wielu dostawców uwierzytelniania
Możesz zdefiniować wielu dostawców i wymagać dowolnego z nich za pomocą authenticate("jwt", "session") { }. Ktor sprawdza ich po kolei i akceptuje żądanie, jeśli dowolny dostawca pomyślnie je zweryfikuje.
Niestandardowe odpowiedzi challenge
Każdy dostawca ma blok challenge, który określa działanie w przypadku niepowodzenia uwierzytelniania. Zwróć odpowiedź 401 z treścią błędu w formacie JSON zamiast domyślnego nagłówka WWW-Authenticate:
jwt("auth-jwt") {
// ...
challenge { _, _ ->
call.respond(HttpStatusCode.Unauthorized, mapOf("error" to "Token expired or invalid"))
}
}Szybkie sprawdzenie
Jakie działanie wykonuje blok validate u dostawcy JWT w Ktorze?
Podsumowanie: wtyczki uwierzytelniania — JWT i sesje
Najważniejsze informacje:
- Zainstaluj
Authenticationi skonfiguruj dostawców (jwt, session, basic, oauth) - Chroń trasy za pomocą
authenticate("providerName") { } - JWT: tokeny bezstanowe; podpisuj je podczas logowania, weryfikuj za pomocą
verifier, a dane uwierzytelniające odczytuj wvalidate - Sesje: stanowe; użyj
call.sessions.set()podczas logowania iclear()podczas wylogowania - Użyj
challenge, aby dostosować format odpowiedzi 401
Często zadawane pytania
Czy lekcja „Wtyczki uwierzytelniania: JWT i sesje” jest bezpłatna?
Tak — pełny tekst „Wtyczki uwierzytelniania: JWT i sesje” 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 Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wtyczki uwierzytelniania: JWT i sesje”?
Zabezpieczaj trasy Ktor za pomocą tokenów JWT Bearer i uwierzytelniania opartego na sesjach. Ćwiczysz Kotlin 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ąć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin 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 „Wtyczki uwierzytelniania: JWT i sesje”?
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 Kotlin Academy?
Tak. Każda lekcja Kotlin 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
- Konfiguracja projektu Ktor: embeddedServer i moduły Application
- Routing i typowane parametry
- Negocjowanie treści i kotlinx.serialization
- Wtyczki uwierzytelniania: JWT i sesje