OAuth 2.0 y autorización JWT en Java: Guía completa

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

Introducción a OAuth 2.0 y autorización JWT en Java

Las aplicaciones web modernas y las API requieren mecanismos robustos de autenticación y autorización. Dos estándares que se han convertido en el estándar de facto en el mundo del desarrollo Java son OAuth 2.0 y JWT (JSON Web Tokens). OAuth 2.0 proporciona un protocolo para la delegación de acceso, mientras que JWT es un formato compacto y autónomo para la transmisión de datos. En este artículo, analizaremos cómo combinar estas tecnologías en Java utilizando Spring Security y bibliotecas populares.

Aprenderá a configurar un servidor de autorización, generar y verificar tokens JWT, así como proteger sus endpoints REST. El material será útil tanto para desarrolladores Java principiantes como experimentados que deseen profundizar sus conocimientos en seguridad.



Fundamentos de OAuth 2.0: Flujos y roles

OAuth 2.0 define cuatro roles: Resource Owner (propietario del recurso), Client (aplicación), Authorization Server (servidor de autorización) y Resource Server (servidor de recursos). Los flujos (grants) más populares incluyen:

  • Authorization Code — para aplicaciones web con parte servidora.
  • Client Credentials — para comunicación servidor a servidor.
  • Resource Owner Password — para clientes de confianza (en desuso).
  • Implicit — para SPA (ya no recomendado).

En Java podemos implementar un servidor OAuth 2.0 usando spring-security-oauth2-authorization-server. Veamos un ejemplo de configuración de un servidor de autorización básico.



Configuración del Authorization Server en Spring Boot

Agregue las dependencias en pom.xml:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency>

Cree la configuración SecurityConfig.java:

@Configuration@EnableWebSecuritypublic class SecurityConfig {

@Bean @Order(1) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); return http.build(); }

@Bean @Order(2) public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(authorize -> authorize .anyRequest().authenticated()) .formLogin(Customizer.withDefaults()); return http.build(); }

@Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient registeredClient = RegisteredClient.withId("client-id") .clientId("my-client") .clientSecret("{noop}secret") .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://localhost:8080/login/oauth2/code/my-client") .scope("read") .scope("write") .build(); return new InMemoryRegisteredClientRepository(registeredClient); }}


JWT: Estructura y generación de tokens

JWT consta de tres partes: Header, Payload y Signature. El Header contiene el tipo de token y el algoritmo de cifrado. El Payload incluye claims (afirmaciones), como sub (sujeto), exp (tiempo de expiración) y roles. La Signature garantiza la integridad de los datos.

Para trabajar con JWT en Java utilizamos la biblioteca io.jsonwebtoken:jjwt. Agregue la dependencia

Blogs

Book Recommendations