0Pricing
Kotlin Academy · Lekcja

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 Authentication i 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 w validate
  • Sesje: stanowe; użyj call.sessions.set() podczas logowania i clear() 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

  1. Konfiguracja projektu Ktor: embeddedServer i moduły Application
  2. Routing i typowane parametry
  3. Negocjowanie treści i kotlinx.serialization
  4. Wtyczki uwierzytelniania: JWT i sesje
← Powrót do Kotlin Academy