Autorización y autenticación en Kotlin: Ktor, JWT y Spring Security

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Autorización y autenticación en Kotlin: análisis completo



En el desarrollo web moderno con Kotlin, los temas de seguridad son prioritarios. La autorización (verificación de permisos de acceso) y la autenticación (confirmación de la identidad del usuario) son mecanismos clave sin los cuales ninguna aplicación puede funcionar. En este artículo, analizaremos cómo implementar estos procesos utilizando bibliotecas populares: Ktor, Spring Security y JWT.



1. Conceptos básicos

  • Autenticación — proceso de verificar quién eres (usuario/contraseña, token, OAuth).
  • Autorización — determinación de qué tienes permitido hacer (roles, permisos de acceso).
  • JWT (JSON Web Token) — forma compacta de transferir datos entre partes como un objeto JSON, firmado con una clave secreta.
  • Sesión — enfoque clásico con almacenamiento de sesión en el servidor.


2. Autenticación con Ktor (Kotlin Server)

Ktor es un framework ligero de JetBrains, ideal para crear APIs REST en Kotlin. Su soporte integrado de autenticación permite configurar rápidamente JWT, Basic Auth u OAuth.



Ejemplo de configuración de autenticación JWT en Ktor:

// build.gradle.ktsdependencies {    implementation("io.ktor:ktor-server-auth-jwt:$ktorVersion")}

// Application.ktimport io.ktor.server.auth.*import io.ktor.server.auth.jwt.*import com.auth0.jwk.JwkProviderBuilderimport java.util.*

fun Application.module() { install(Authentication) { jwt("auth-jwt") { verifier(JwkProviderBuilder("https://your-issuer.com/.well-known/jwks.json") .build() .get("your-kid")) validate { credential -> if (credential.payload.audience.contains("my-app")) { JWTPrincipal(credential.payload) } else null } } } routing { authenticate("auth-jwt") { get("/secure") { val principal = call.principal<JWTPrincipal>() val username = principal?.payload?.getSubject() call.respondText("Hello, $username!") } } }}

En este ejemplo, usamos JWTPrincipal para extraer los datos del usuario del token. Ktor verifica automáticamente la firma y la fecha de expiración.



3. Autorización con Spring Security

Spring Boot con Kotlin es una combinación potente para aplicaciones empresariales. Spring Security proporciona un sistema flexible de filtros y anotaciones.



Configuración básica con JWT:

// build.gradle.ktsdependencies {    implementation("org.springframework.boot:spring-boot-starter-security")    implementation("io.jsonwebtoken:jjwt-api:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")}

// SecurityConfig.kt@Configuration@EnableWebSecurityclass SecurityConfig( private val jwtAuthenticationFilter: JwtAuthenticationFilter) { @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http .csrf { it.disable() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } .authorizeHttpRequests { auth -> auth .requestMatchers("/api/auth/**").permitAll() .requestMatchers("/api/admin/**").hasRole("ADMIN") .anyRequest().authenticated() } .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter::class.java) return http.build() }}

// JwtAuthenticationFilter.kt@Componentclass JwtAuthenticationFilter( private val jwtService: JwtService) : OncePerRequestFi

Recommendations