docsSwagger

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 seguridad
    • type: 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:

  1. Swagger UI: Interfaz visual interactiva

    http://localhost:8080/api/swagger-ui.html
  2. API Docs (JSON): Documentación en formato JSON

    http://localhost:8080/api/v3/api-docs
  3. 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.