Kotlin Academy · Lektion

Authentication-plugins: JWT og sessioner

Sikr Ktor-routes med JWT bearer-tokens og sessionsbaseret authentication.

Lektion 4 af 413 trin

Authentication-plugins: JWT og sessioner er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Oversigt over Ktor-autentificering

Ktors Authentication-plugin giver en samlet API til at beskytte ruter. Du konfigurerer en eller flere udbydere (JWT, Session, Basic, OAuth osv.) og omslutter derefter ruterne i en authenticate("providerName") { }-blok.

Tilføj autentificeringsafhængigheder

Tilføj bibliotekerne til autentificering og JWT til din byggekonfiguration:

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")
}

Konfiguration af JWT-autentificering

Installér Authentication-plugin'et, og konfigurer en JWT-udbyder. verifier validerer tokenets signatur, mens validate udtrækker principalen fra payloaden:

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
        }
    }
}

Beskyt ruter med JWT

Omslut en hvilken som helst rutegruppe i authenticate("auth-jwt") { }. Ikke-autentificerede forespørgsler får automatisk et 401-svar:

routing {
    authenticate("auth-jwt") {
        get("/protected") {
            val principal = call.principal<JWTPrincipal>()!!
            val username = principal.payload.getClaim("username").asString()
            call.respondText("Hello, $username")
        }
    }
}

Udstedelse af et JWT-token

Generér og signér en JWT på login-endpointet ved hjælp af java-jwt-biblioteket:

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))
}

Sessionsautentificering

Sessioner gemmer brugerens tilstand på serversiden (eller på klientsiden som signerede cookies). Installér Sessions-plugin'et, og definér en dataklasse til sessionsdata:

data class UserSession(val userId: Long, val username: String)

install(Sessions) {
    cookie<UserSession>("user_session") {
        cookie.path = "/"
        cookie.httpOnly = true
    }
}

Konfiguration af en udbyder til sessionsautentificering

Opret en udbyder til sessionsautentificering, som læser sessionen og returnerer en principal:

install(Authentication) {
    session<UserSession>("auth-session") {
        validate { session -> session }
        challenge { call.respond(HttpStatusCode.Unauthorized) }
    }
}

Angivelse og rydning af sessioner

Angiv en session efter login med call.sessions.set(), og ryd den ved udlogning med 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 eller session: Hvornår skal du bruge hvad

JWT: tilstandsløs og velegnet til API'er, der bruges af mobil- og SPA-klienter. Tokenet indeholder alle claims, så serveren ikke har brug for et sessionslager. Sessioner: tilstandsbaserede og velegnede til serverside-renderede webapps. Sessions-ID'et ligger i en cookie, mens serveren gemmer dataene (i hukommelsen, Redis eller en database).

Kombination af flere autentificeringsudbydere

Du kan definere flere udbydere og kræve en hvilken som helst af dem med authenticate("jwt", "session") { }. Ktor prøver dem i rækkefølge og accepterer forespørgslen, hvis en af udbyderne validerer den korrekt.

Tilpassede udfordringssvar

Hver udbyder har en challenge-blok, som definerer, hvad der skal ske, når autentificeringen mislykkes. Returnér en 401 med et JSON-fejlindhold i stedet for standardheaderen WWW-Authenticate:

jwt("auth-jwt") {
    // ...
    challenge { _, _ ->
        call.respond(HttpStatusCode.Unauthorized, mapOf("error" to "Token expired or invalid"))
    }
}

Hurtigt tjek

Hvad gør validate-blokken i en Ktor-JWT-udbyder?

Opsummering: Autentificeringsplugins — JWT og sessioner

Vigtigste pointer:

  • Installér Authentication, og konfigurer udbydere (jwt, session, basic, oauth)
  • Beskyt ruter med authenticate("providerName") { }
  • JWT: tilstandsløse tokens; signér ved login, verificér med verifier, og læs claims i validate
  • Sessioner: tilstandsbaserede; brug call.sessions.set() ved login og clear() ved udlogning
  • Brug challenge til at tilpasse formatet for 401-svaret
Gratis at komme i gang

Lær Kotlin med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Authentication-plugins: JWT og sessioner” gratis?

Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “Authentication-plugins: JWT og sessioner”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Authentication-plugins: JWT og sessioner”?

Sikr Ktor-routes med JWT bearer-tokens og sessionsbaseret authentication. Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Kotlin Academy?

Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Authentication-plugins: JWT og sessioner”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?

Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Ktor-projektopsætning: embeddedServer og Application-moduler
  2. Routing og typede parametre
  3. Content Negotiation og kotlinx.serialization
  4. Authentication-plugins: JWT og sessioner
← Tilbage til Kotlin Academy