Авторизация и аутентификация в Kotlin: обзор инструментов и практические примеры
В современной веб-разработке на Kotlin безопасность приложения начинается с правильной реализации аутентификации (проверки подлинности пользователя) и авторизации (проверки прав доступа). В этой статье мы подробно разберём основные библиотеки и подходы для создания защищённых приложений на Kotlin — как для серверной части (Ktor, Spring Boot), так и для мобильных Android-приложений.
1. Основные понятия: Authentication vs Authorization
Аутентификация (Authentication) — это процесс проверки, кем является пользователь (логин + пароль, токен, биометрия).
Авторизация (Authorization) — это определение, какие ресурсы и действия доступны аутентифицированному пользователю (роли, права).
В Kotlin обе задачи решаются с помощью специализированных библиотек, которые мы рассмотрим ниже.
2. Аутентификация в Ktor (серверный фреймворк)
Ktor — современный асинхронный сервер от JetBrains. Он предоставляет встроенный модуль ktor-server-auth для аутентификации.
Установка зависимости (Gradle)
implementation("io.ktor:ktor-server-auth:$ktor_version")
implementation("io.ktor:ktor-server-auth-jwt:$ktor_version") // для JWT
Пример: аутентификация по JWT токену
import io.ktor.server.auth.*
import io.ktor.server.auth.jwt.*
import com.auth0.jwk.JwkProvider
import io.ktor.server.application.*
fun Application.configureAuth() {
install(Authentication) {
jwt("auth-jwt") {
val jwkProvider = JwkProvider("https://your-auth-domain/.well-known/jwks.json")
verifier(jwkProvider)
validate { credential ->
if (credential.payload.audience.contains("my-app")) {
JWTPrincipal(credential.payload)
} else null
}
}
}
}
// В маршрутах:
authenticate("auth-jwt") {
get("/protected") {
val principal = call.principal<JWTPrincipal>()
call.respondText("Доступ разрешён пользователю: ${principal?.payload?.subject}")
}
}
3. Spring Security для Kotlin
Spring Security — де-факто стандарт для защиты Spring Boot приложений. В Kotlin он используется с DSL-конфигурацией.
Добавление в проект (Gradle)
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web")
Конфигурация SecurityConfig на Kotlin
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.core.userdetails.User
import org.springframework.security.provisioning.InMemoryUserDetailsManager
import org.springframework.security.web.SecurityFilterChain
@Configuration
@EnableWebSecurity
class SecurityConfig {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http
.authorizeHttpRequests { auth ->
auth.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
}
.httpBasic()
return http.build()
}
@Bean
fun users(): InMemoryUserDetailsManager {
val user = User.withDefaultPasswordEncoder()
.username("user").password("pass").roles("USER").build()
val admin = User.withDefaultPasswordEncoder()
.username("admin").password("admin").roles("ADMIN").build()
return InMemoryUserDetailsManager(user, admin)
}
}
4. Библиотека JWT для Kotlin (auth0/java-jwt)
Для работы с JSON Web Token в Kotlin часто используют библиотеку com.auth0:java-jwt. Она поддерживает создание, подпись и проверку токенов.
Пример создания и верификации JWT
import com.auth0.jwt.JWT
import com.auth0.jwt.algorithms.Algorithm
import java.util.Date
val secret = "my-secret-key"
val algorithm = Algorithm.HMAC256(secret)
// Создание токена
fun createToken(userId: String, email: String): String {
return JWT.create()
.withSubject(userId)
.withClaim("email", email)
.withExpiresAt(Date(System.currentTimeMillis() + 3600_000)) // 1 час
.sign(algorithm)
}
// Проверка токена
fun verifyToken(token: String): Boolean {
return try {
val verifier = JWT.require(algorithm).build()
verifier.verify(token)
true
} catch (e: Exception) {
false
}
}
5. OAuth2 и социальная аутентификация
Для входа через Google, GitHub, VK и другие провайдеры в Kotlin удобно использовать Ktor OAuth или Spring Security OAuth2 Client.
Пример для Ktor (OAuth2 с GitHub)
install(Authentication) {
oauth("github-oauth") {
clientId = System.getenv("G