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