Autenticación¶
El servicio usa JWT con dos tokens:
- Access token: se envía como header
Authorization: Bearer <token>en cada request protegida. Contiene, entre otros, los claimsdniyrole, usados por algunos controladores para autorización. - Refresh token: se envía con el prefijo literal
Refresh(por ejemplo,Refresh <token>) al endpoint/api/auth/refreshtokenpara obtener un nuevo par de tokens.
Rutas públicas (no requieren token): /api/auth/**, /api-docs/**, /v3/**, /swagger-ui/**, /swagger-resources/**, /error/**. Cualquier otra ruta requiere autenticación (WebSecurityConfig, sesión STATELESS).
Roles disponibles (ERole): ROLE_USER, ROLE_ADMIN, ROLE_SUPER. Se crean automáticamente al iniciar la aplicación (RoleDataInitializer).
Nota de seguridad: al registrar un usuario (
/api/auth/signup) el cliente indica en el body qué rol(es) quiere (user,admin,super). No hay validación de que quien llama al endpoint tenga permiso para asignarse esos roles — cualquier registro puede pediradminosuper.
Endpoints¶
Base URL: /api/auth
| Método | Ruta | Auth | Body/Params | Descripción |
|---|---|---|---|---|
| POST | /signin | No | Body: username, password | Inicia sesión y retorna access/refresh token junto con el id y roles del usuario. |
| POST | /signup | No | Body: username, password, email, firstName, lastName, dni, tuition?, authorization?, role[] | Registra un usuario nuevo (username/email/dni únicos) y asigna roles (user por defecto si no se envía role). tuition y authorization son opcionales. |
| POST | /refreshtoken | No | Body: refreshToken (con prefijo Refresh) | Valida el refresh token y genera un nuevo access + refresh token. |
| POST | /{id}/upload-signature-img | Sí | Header Authorization; Multipart file | Sube la imagen de firma del usuario {id} y actualiza signatureImg. |
| DELETE | /delete/{dni} | Sí | Header Authorization | Deshabilita lógicamente al usuario (status = DELETED). |
| PUT | /user/{dni} | Sí | Header Authorization; Params oldPassword, newPassword | Cambia la contraseña; valida que el dni del token coincida con el del path. |
Ejemplos¶
Registro (signup)¶
curl -X POST http://localhost:8080/api/auth/signup \
-H "Content-Type: application/json" \
-d '{
"username": "jperez",
"password": "Segura123!",
"email": "jperez@empresa.com",
"firstName": "Juan",
"lastName": "Pérez",
"dni": "12345678",
"tuition": "MP12345",
"authorization": "AUTH123456",
"role": ["user"]
}'
Respuesta 200 OK:
Errores comunes: 400 BAD_REQUEST si username, email o dni ya existen.
tuition es opcional: puede omitirse del body (o enviarse vacío) para usuarios sin matrícula profesional. Si se omite, se guarda como cadena vacía y, al firmar con sign-by-label o sign-by-coord-simple, la línea CQFP: <matrícula> del bloque de firma no se pinta (independientemente del valor de printCqfp).
authorization también es opcional (no se persiste ni se usa en ningún otro flujo; solo se acepta y valida su longitud si se envía, máximo 40 caracteres).
Inicio de sesión (signin)¶
curl -X POST http://localhost:8080/api/auth/signin \
-H "Content-Type: application/json" \
-d '{ "username": "jperez", "password": "Segura123!" }'
Respuesta 200 OK (JwtResponse):
{
"token": "Bearer eyJhbGciOiJIUzI1NiJ9...",
"type": "Bearer ",
"id": 1,
"refreshToken": "eyJhbGciOiJIUzI1NiJ9...",
"roles": ["ROLE_USER"]
}
El valor de token ya incluye el prefijo Bearer; se envía tal cual en el header Authorization de las siguientes requests.
Refrescar token¶
curl -X POST http://localhost:8080/api/auth/refreshtoken \
-H "Content-Type: application/json" \
-d '{ "refreshToken": "Refresh eyJhbGciOiJIUzI1NiJ9..." }'
El campo refreshToken debe incluir el prefijo literal Refresh (con espacio); el servidor lo recorta antes de validar el token. Si no lo incluye, responde 403 FORBIDDEN con el mensaje You must add 'Refresh ' to the value of refreshToken.
Respuesta 200 OK: mismo formato que signin (JwtResponse), con un nuevo access y refresh token.
Subir imagen de firma¶
curl -X POST http://localhost:8080/api/auth/1/upload-signature-img \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..." \
-F "file=@firma.png"
La imagen se guarda en SIGNATURE_IMAGES_PATH con el nombre user_<id>_<uuid>.<extensión original> y se usa por defecto cuando se firma con hasImageSignature=true (ver Documentos).
Deshabilitar usuario¶
curl -X DELETE http://localhost:8080/api/auth/delete/12345678 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."
Marca status = DELETED en el usuario; no elimina el registro físicamente.
Cambiar contraseña¶
curl -X PUT "http://localhost:8080/api/auth/user/12345678?oldPassword=Segura123!&newPassword=NuevaSegura456!" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."
El dni del path debe coincidir con el claim dni del token; si no coincide, responde 400 BAD_REQUEST con "The passed token corresponds to another user".