JWT токены в Kotlin: Полное руководство с примерами кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

JWT токены в Kotlin: Полное руководство для разработчиков

JSON Web Token (JWT) — это компактный, URL-безопасный формат для передачи утверждений (claims) между двумя сторонами. В экосистеме Kotlin JWT широко используется для аутентификации, авторизации и обмена данными в микросервисах, мобильных приложениях и веб-приложениях на Ktor или Spring Boot. В этой статье мы разберём, как создавать, подписывать и проверять JWT токены на Kotlin с использованием популярных библиотек: JJWT (Java JWT) и Auth0 java-jwt.

Что такое JWT и зачем он нужен в Kotlin?

JWT состоит из трёх частей: заголовка (header), полезной нагрузки (payload) и подписи (signature). В Kotlin JWT токены позволяют:

  • Реализовать stateless аутентификацию (сервер не хранит сессии).
  • Передавать роли и права доступа (claims).
  • Работать с распределёнными системами и API.
  • Интегрироваться с OAuth2 и OpenID Connect.

Установка библиотек для работы с JWT в Kotlin

Для Kotlin/JVM проектов лучше всего подходят две библиотеки: io.jsonwebtoken:jjwt (JJWT) и com.auth0:java-jwt. Добавьте зависимости в build.gradle.kts:

// build.gradle.kts
dependencies {
    // JJWT (рекомендуется)
    implementation("io.jsonwebtoken:jjwt-api:0.12.6")
    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6")
    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6") // для JSON

    // Auth0 java-jwt
    implementation("com.auth0:java-jwt:4.4.0")
}

Создание JWT токена с помощью JJWT (Kotlin)

JJWT предоставляет чистый fluent API. Ниже приведён пример создания токена с подписью HMAC-SHA256:

import io.jsonwebtoken.Jwts
import io.jsonwebtoken.SignatureAlgorithm
import io.jsonwebtoken.security.Keys
import java.util.Date

fun createJwtToken(userId: String, role: String): String {
    val secretKey = Keys.hmacShaKeyFor("my_secret_key_32_bytes_long!!".toByteArray())

    val token = Jwts.builder()
        .setSubject(userId)
        .claim("role", role)
        .setIssuedAt(Date())
        .setExpiration(Date(System.currentTimeMillis() + 3600_000)) // 1 час
        .signWith(secretKey, SignatureAlgorithm.HS256)
        .compact()

    return token
}

Проверка и парсинг JWT токена

Для валидации токена используйте Jwts.parserBuilder(). Пример проверки с извлечением claims:

import io.jsonwebtoken.Jwts
import io.jsonwebtoken.security.Keys

fun validateToken(token: String): Map<String, Any>? {
    return try {
        val secretKey = Keys.hmacShaKeyFor("my_secret_key_32_bytes_long!!".toByteArray())
        val claims = Jwts.parserBuilder()
            .setSigningKey(secretKey)
            .build()
            .parseClaimsJws(token)
            .body

        claims
    } catch (e: Exception) {
        println("Invalid token: ${e.message}")
        null
    }
}

Работа с JWT через Auth0 java-jwt (Kotlin)

Библиотека Auth0 также популярна. Пример создания и проверки токена с RSA-подписью:

import com.auth0.jwt.JWT
import com.auth0.jwt.algorithms.Algorithm
import com.auth0.jwt.interfaces.DecodedJWT
import java.security.interfaces.RSAPrivateKey
import java.security.interfaces.RSAPublicKey
import java.util.Date

// Генерация токена
fun createRsaToken(userId: String, privateKey: RSAPrivateKey): String {
    val algorithm = Algorithm.RSA256(null, privateKey)
    return JWT.create()
        .withSubject(userId)
        .withIssuer("auth0")
        .withExpiresAt(Date(System.currentTimeMillis() + 3600_000))
        .sign(algorithm)
}

// Проверка токена
fun verifyRsaToken(token: String, publicKey: RSAPublicKey): DecodedJWT? {
    return try {
        val algorithm = Algorithm.RSA256(publicKey, null)
        JWT.require(algorithm)
            .withIssuer("auth0")
            .build()
            .verify(token)
    } catch (e: Exception) {
        null
    }
}

JWT в Ktor (серверный фреймворк на Kotlin)

Ktor имеет модуль ktor-server-auth-jwt для интеграции JWT. Пример конфигурации:

import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.auth.jwt.*

fun Application.configure                    

Рекомендаций