Introducción a OAuth 2.0 y JWT en Kotlin
\n\nLas aplicaciones web y las API modernas requieren mecanismos robustos de autenticación y autorización. Dos estándares clave — OAuth 2.0 (protocolo de delegación de acceso) y JWT (JSON Web Token, formato compacto de token) — se utilizan a menudo juntos para construir sistemas seguros. Kotlin, gracias a su compatibilidad con Java y su sintaxis concisa, es ideal para implementar estos protocolos.
\n\nEn este artículo, analizaremos cómo implementar en la práctica la autorización OAuth 2.0 y JWT en Kotlin. Aprenderá a configurar un servidor de emisión de tokens, crear endpoints protegidos y manejar diferentes tipos de concesión (grant types), como Authorization Code y Client Credentials.
\n\nFundamentos: OAuth 2.0 y JWT
\n\n¿Qué es OAuth 2.0?
\nOAuth 2.0 es un protocolo que permite a aplicaciones de terceros obtener acceso limitado a los recursos de un usuario sin compartir su nombre de usuario y contraseña. Los participantes principales son:
\n- \n
- Resource Owner (propietario del recurso) — generalmente el usuario. \n
- Client (cliente) — la aplicación que solicita acceso. \n
- Authorization Server (servidor de autorización) — emite los tokens. \n
- Resource Server (servidor de recursos) — almacena los datos protegidos. \n
¿Qué es JWT?
\nJWT es un token compacto y seguro para URL, que consta de tres partes (header, payload, signature) separadas por puntos. Se utiliza para transmitir afirmaciones (claims) entre las partes. Ventajas de JWT:
\n- \n
- No requiere almacenamiento de sesión en el servidor (stateless). \n
- Contiene toda la información necesaria (por ejemplo, ID de usuario, roles). \n
- Está firmado digitalmente, lo que garantiza su integridad. \n
Implementación de OAuth 2.0 con JWT en Kotlin (Spring Boot)
\n\nConsideremos un ejemplo práctico utilizando Spring Boot y la biblioteca Spring Security. Crearemos un servidor de autorización simple y un recurso protegido.
\n\nPaso 1: Configuración de dependencias
\nAgregue las dependencias necesarias en build.gradle.kts:
dependencies {\n implementation("org.springframework.boot:spring-boot-starter-web")\n implementation("org.springframework.boot:spring-boot-starter-security")\n implementation("org.springframework.security:spring-security-oauth2-authorization-server")\n implementation("io.jsonwebtoken:jjwt-api:0.12.3")\n runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")\n runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")\n}\n\nPaso 2: Configuración del servidor de autorización
\nCree una clase de configuración para OAuth 2.0:
\nimport org.springframework.context.annotation.Bean\nimport org.springframework.context.annotation.Configuration\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity\nimport org.springframework.security.core.userdetails.User\nimport org.springframework.security.core.userdetails.UserDetailsService\nimport org.springframework.security.oauth2.core.AuthorizationGrantType\nimport org.springframework.security.oauth2.core.ClientAuthenticationMethod\nimport org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClient\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository\nimport org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration\nimport org.springframework.security.provisioning.InMemoryUserDetailsManager\nimport org.springframework.security.web.SecurityFilterChain\nimport java.util.UUID\n\n@Configuration\n@EnableWebSecurity\nclass SecurityConfig {\n\n @Bean\n