Microservicio Spring Boot para autenticacion centralizada del sistema distribuido 2026.
Actualmente incluye:
- base del microservicio
auth - persistencia con MySQL
- configuracion por perfiles (
dev,prod) - configuracion externa con Config Server
- registro en Eureka
- migracion inicial con Flyway
- usuarios y roles base
- autenticacion con Spring Security
- emision de JWT propia para
S8 P1 - observabilidad base con Actuator y Prometheus
- documentacion OpenAPI en
dev
Cliente -> Auth Service -> JWT
Cliente -> Gateway -> Microservicios
En esta fase, auth-service actua como emisor de identidad para el sistema.
La validacion del token ya fue integrada en:
gatewaycomo borde seguro del sistemaproductocomoresource server
Para las pruebas locales en Windows, se recomienda usar PowerShell con Invoke-RestMethod en lugar de bash.
En la fase actual:
gatewayvalida JWT en el bordeproductovalida JWT localmente comoresource servercatalogose mantiene sin seguridad propia y se protege solo desdegateway
auth corresponde principalmente a:
S8Control de acceso al sistema
Se apoya sobre lo ya construido en:
S1-S4infraestructura distribuida baseS6interaccion entre servicios y resilienciaS7observabilidad y trazabilidad
Y deja preparado el salto futuro a:
P2integracion conKeycloaku otro proveedor de identidad
- Java 17
- Spring Boot 3.5.x
- Spring Cloud 2025.x
- Maven 3.9+
- Spring Security
- JWT (
jjwt) - Spring Data JPA
- MySQL 8
- Flyway
- Config Client
- Eureka Client
- Actuator
- Micrometer Prometheus
- SpringDoc OpenAPI
| Servicio | Puerto |
|---|---|
| Auth DEV | 8041 |
| Auth PROD | 8042 |
| MySQL Auth DEV | 3341 |
| MySQL Auth PROD | 3342 |
| Config Server DEV | 7071 |
| Config Server PROD | 7072 |
| Registry Server DEV | 7081 |
| Registry Server PROD | 7082 |
| Modo | Ejecucion app | Base de datos | Configuracion | Registro | Puerto app |
|---|---|---|---|---|---|
| DEV | mvn spring-boot:run |
Docker/local | Config Server DEV | Registry DEV | 8041 |
| PROD | Docker | Docker | Config Server PROD | Registry PROD | 8042 |
Base de datos minima para esta fase:
usersrolesuser_roles
Objetivo del modelo:
- autenticar usuarios locales para
S8 P1 - emitir JWT con claims basicos
- desacoplar identidad del resto del sistema
- dejar el sistema preparado para reemplazar
auth-serviceporKeycloakmas adelante
Claims base del JWT:
subissiatexprolespreferred_username
Significado de cada claim:
sub-> sujeto autenticado; en esta fase representa elusernameiss-> emisor del token; identifica que el JWT fue generado porauthiat-> instante de emision del tokenexp-> instante de expiracion del tokenroles-> lista de autoridades del usuario autenticado, usada luego porgatewayy microservicios para autorizacionpreferred_username-> nombre de usuario legible, util para interoperabilidad y futura integracion con proveedores comoKeycloak
POST /auth/login
Payload:
{
"username": "admin",
"password": "admin123"
}Respuesta esperada:
{
"accessToken": "eyJhbGciOiJIUzI1NiJ9...",
"tokenType": "Bearer",
"expiresIn": 3600000,
"username": "admin",
"roles": ["ROLE_ADMIN"]
}Interpretacion del token emitido:
accessTokencontiene la identidad autenticadatokenTypeindica el prefijo esperado en el headerAuthorizationexpiresInexpresa la vigencia del token en milisegundosrolesrefleja las autoridades cargadas desde base de datos
GET /actuator/healthGET /actuator/metricsGET /actuator/prometheus
Archivos esperados:
infra/config-repo/auth-dev.yml
infra/config-repo/auth-prod.yml
Variables importantes:
jwt.secretjwt.expirationjwt.issuer
En prod, el secreto se resuelve desde:
${JWT_SECRET}
Desde infra/config-server:
mvn spring-boot:runDesde infra/registry-server:
mvn spring-boot:runDesde services/auth:
docker compose -f docker-compose-dev.yml up -dDesde services/auth:
mvn spring-boot:runSwagger:
http://localhost:8041/swagger-ui/index.html
Health:
http://localhost:8041/actuator/health
Prometheus:
http://localhost:8041/actuator/prometheus
Login:
POST http://localhost:8041/auth/login
Prueba recomendada en PowerShell:
$body = @{
username = "admin"
password = "admin123"
} | ConvertTo-Json
$response = Invoke-RestMethod `
-Method Post `
-Uri "http://localhost:8041/auth/login" `
-ContentType "application/json" `
-Body $body
$response
$token = $response.accessTokenDesde infra:
docker compose up -dEn services/auth/.env:
AUTH_MYSQL_ROOT_PASSWORD=root
AUTH_MYSQL_DATABASE=db_auth
SPRING_PROFILES_ACTIVE=prod
CONFIG_SERVER_URL=http://config-server:7071
JWT_SECRET=REEMPLAZAR_POR_SECRET_BASE64_GENERADO
AUTH_DB_HOST=mysql-auth
AUTH_DB_PORT=3306
AUTH_DB_NAME=db_auth
AUTH_DB_USERNAME=root
AUTH_DB_PASSWORD=rootDesde services/auth:
docker compose up -dHealth:
http://localhost:8042/actuator/health
Prometheus:
http://localhost:8042/actuator/prometheus
Login:
POST http://localhost:8042/auth/login
Prueba recomendada en PowerShell:
$body = @{
username = "admin"
password = "admin123"
} | ConvertTo-Json
$response = Invoke-RestMethod `
-Method Post `
-Uri "http://localhost:8042/auth/login" `
-ContentType "application/json" `
-Body $body
$responsePara pruebas de S8 P1 se cargan usuarios base:
admin / admin123user / user123
Roles iniciales:
ADMINUSER
Las contrasenas se almacenan cifradas con BCrypt.
Cuando el login es exitoso, el token emitido contiene:
subcon el identificador principal del usuario autenticadoisscon valorauthiatcon el momento exacto de emisionexpcon el momento exacto de expiracionrolescon autoridades comoROLE_ADMINoROLE_USERpreferred_usernamecon el nombre de usuario legible
Esto permite que el resto del sistema, especialmente gateway, pueda validar:
- quien es el usuario
- quien emitio el token
- si el token sigue vigente
- que roles trae asociados
auth-service ya expone:
GET /actuator/healthGET /actuator/metricsGET /actuator/prometheus- logs en consola y archivo local
Archivo de log en desarrollo:
services/auth/logs/auth.log
- SESION-08-SEGURIDAD-CON-AUTH-SERVICE.md
- Microservicio base
auth - Config Server
- Registry Server listo para integracion
- Base de datos y migracion Flyway
- Usuarios y roles base
- Login con Spring Security
- Emision propia de JWT
- Integracion base de validacion JWT en Gateway
-
productoprotegido como resource server -
catalogoprotegido localmente como resource server - Reemplazo por
Keycloak
Continuar con el bloque de seguridad sobre la base actual:
- probar autorizacion por roles sobre
producto - validar el flujo completo
auth -> gateway -> producto - mantener
catalogosolo detras degatewayen esta fase para contraste didactico - probar el mismo esquema en
prod - dejar preparado el reemplazo posterior por
Keycloak
git tag -a vs08-auth -m "Auth service con Spring Security, usuarios, roles y JWT integrado a gateway"
git push origin vs08-auth