Swagger (OpenAPI)
La documentación de la API está disponible a través de Swagger UI. Puedes acceder a ella en:
http://localhost:8080/api/swagger-ui.html
Anotaciones de Swagger
Documentación de Controladores
Para documentar un controlador, usamos las siguientes anotaciones a nivel de clase:
@Tag(name = "Autenticación", description = "API de autenticación y autorización")
@RestController
@RequestMapping("/v1/auth")
public class AuthController {
// ...
}
Documentación de Endpoints
Cada endpoint debe estar documentado con:
/**
* Endpoint para renovar el token de acceso.
* Utiliza el token de actualización para generar un nuevo token de acceso.
*
* @param request DTO que contiene el token de actualización
* @return ResponseEntity con AuthResponse que incluye los nuevos tokens
*/
@Operation(summary = "Renovar token",
description = "Genera un nuevo token de acceso usando el token de actualización")
@ApiResponses(value = {
@ApiResponse(
responseCode = "200",
description = "Token renovado exitosamente"
),
@ApiResponse(
responseCode = "400",
description = "Token de actualización inválido o malformado",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(implementation = ErrorResponse.class)
)
)
// ... más respuestas
})
@PostMapping("/refresh-token")
Anotaciones Principales
@Tag
Define una categoría en la documentación:
@Tag(name = "Usuarios", description = "Operaciones relacionadas con usuarios")
@Operation
Describe un endpoint específico:
@Operation(
summary = "Crear usuario",
description = "Crea un nuevo usuario en el sistema"
)
@ApiResponses
Documenta las posibles respuestas:
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "Usuario creado"),
@ApiResponse(responseCode = "400", description = "Datos inválidos")
})
@Parameter
Documenta parámetros de entrada:
@Parameter(
name = "id",
description = "ID del usuario",
required = true,
example = "123"
)
@Schema
Define la estructura de los modelos:
@Schema(description = "Respuesta de autenticación")
public class AuthResponse {
@Schema(description = "Token de acceso JWT",
example = "eyJhbGciOiJ...")
private String accessToken;
}
Configuración de Swagger
La configuración de Swagger se encuentra en SwaggerConfig.java
. Analicemos cada parte:
@Configuration
@SecurityScheme(
name = "Bearer Authentication", // Nombre del esquema de seguridad
type = SecuritySchemeType.HTTP, // Tipo HTTP para autenticación
bearerFormat = "JWT", // Formato del token (JWT)
scheme = "bearer" // Esquema bearer
)
public class SwaggerConfig {
@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("JWT Spring Boot API") // Título de la API
.description("API de autenticación y autorización con JWT")
.version("v1") // Versión de la API
.license(new License() // Información de licencia
.name("Programando en Java")
.url("https://programandoenjava.com")))
.externalDocs(new ExternalDocumentation() // Documentación externa
.description("Documentación completa")
.url("https://jwt-spring-boot.programandoenjava.com/docs"));
}
}
Explicación de Anotaciones
@Configuration
- Indica que esta clase proporciona configuración de beans para Spring
- Permite que Spring cree y administre los beans definidos
@SecurityScheme
- Define el esquema de seguridad para la documentación
- Configura cómo se debe autenticar en la API
- Parámetros importantes:
name
: Identificador del esquema de seguridadtype
: Tipo de autenticación (HTTP en este caso)bearerFormat
: Formato del token (JWT)scheme
: Esquema de autenticación (bearer)
Configuración OpenAPI
Info Object
.title()
: Nombre de la API.description()
: Descripción breve de la funcionalidad.version()
: Versión actual de la API.license()
: Información sobre la licencia.name()
: Nombre del licenciante.url()
: URL con más información
External Documentation
.externalDocs()
: Enlaces a documentación adicional.description()
: Descripción del enlace.url()
: URL de la documentación completa
Uso en Controladores
Para proteger un endpoint con esta configuración:
@SecurityRequirement(name = "Bearer Authentication")
@Operation(summary = "Endpoint protegido")
@GetMapping("/protected")
public ResponseEntity<String> protectedEndpoint() {
// ... código del endpoint
}
La anotación @SecurityRequirement
se puede usar a nivel de clase o método:
// A nivel de clase - aplica a todos los endpoints del controlador
@SecurityRequirement(name = "Bearer Authentication")
@RestController
@RequestMapping("/v1/users")
public class UserController {
// todos los endpoints requerirán autenticación
}
// A nivel de método - aplica solo a endpoints específicos
@RestController
@RequestMapping("/v1/products")
public class ProductController {
@SecurityRequirement(name = "Bearer Authentication")
@GetMapping("/private")
public ResponseEntity<String> privateEndpoint() {
// endpoint protegido
}
@GetMapping("/public")
public ResponseEntity<String> publicEndpoint() {
// endpoint público
}
}
Explicación de @SecurityRequirement
- Propósito: Indica que un endpoint requiere autenticación JWT
- Parámetros:
name
: Debe coincidir con el nombre definido en@SecurityScheme
- Efectos:
- Añade el botón “Authorize” en Swagger UI
- Muestra un candado 🔒 junto al endpoint
- Permite probar endpoints protegidos desde Swagger UI
- Uso práctico:
- Swagger UI solicitará el token JWT
- El token se incluirá automáticamente en las peticiones
- Facilita las pruebas de endpoints protegidos
Consejo: Para endpoints públicos, simplemente omite la anotación
@SecurityRequirement
Acceso a Swagger UI
La interfaz de Swagger está disponible en tres formatos:
-
Swagger UI: Interfaz visual interactiva
http://localhost:8080/api/swagger-ui.html
-
API Docs (JSON): Documentación en formato JSON
http://localhost:8080/api/v3/api-docs
-
API Docs (YAML): Documentación en formato YAML
http://localhost:8080/api/v3/api-docs.yaml
Nota: Las URLs asumen que estás usando el puerto 8080 y el context-path
/api
. Ajusta según tu configuración.