README.md |
AML_Auth
Este API RESTfull permite la gestion completa de usuarios y autenticacion en una aplicación
Tabla Contenidos
Descripcion
Este API RESTful incluye:
- Registro de usuarios
- Autenticacion
- Validacion de token
- Consulta por usuario autenticado
Tecnologias
- Spring boot (version 3.2.4)
- Spring data Mongo
- Spring Security
- Spring Web
- JWT (JSON Web Token)
- Swagger
- MongoDB
Arquitectura
Componentes
Controller
AuthController:
-
login (loginRequest):
- ejecuta la logica para generar la autenticacion de un usuario validando su existencia en la base de datos; envia objeto que envia el usuario y contraseña
-
register (registerRequest):
- ejecuta la logica de creacion de usuario, validando su existencia, y guardando al usuario en la base de datos; envia un objeto con la informacion necesaria de registro
-
registerByCsv (registerRequest)
UserController:
-
getUserInfo (httpServletRequest):
- ejecuta la logica para retornar los datos la informacion del usuario autenticado; obteniendo el header de authorizacion para obtener el token de validacion; se retorna un objeto con respuesta de validez del token y los datos del usuario si todo se completo correctamente
HelloController:
-
helloUser():
- ejecuta la logica para comprobar la autenticacion de un usuario, validando si el token enviado es correcto me genera una salida exitosa.
-
hello():
- genera una consulta para una direccion sin proteccion para validar el punto sin autenticacion.
JwtController:
-
validateToken (request):
- ejecuta la logica para comprobar el cuerpo del token y retornar una respuesta dependiendo la validez del token.
Config
CustomExcepctionHandler:
- Esta configuracion se encarga de adaptar las excepciones que pueda generar el token para mostrar la respuesta especifica requerida para el API
OneApiConfig:
- En este config se maqueta el cuerpo para mostrar en la documentacion de springdoc-swagger
ApplicationConfig:
- En este config estan implementados todos los beans para poder usar en todo el codigo, tanto los de autenticacion y control de seguridad
CorsConfig:
- En este config se genero el filtro de validaciones por conexion remota para configurar las excepciones de tipo Cors
SecurityConfig:
- En este config se genero tiene el SecurityFilterChain para todas las validaciones de los endpoints autorizaods y los que requieren autenticacion para generar consultas al API
Service
JwtService:
-
Este Servicio aplica toda la logica necesaria para el token, donde incluye:
-
generar token
-
obtener key secret (tiene como parametro un key secret de tipo string)
-
obtener nombre de usuario por token
-
si el token es valido (compara el nombre de usuario dentro del token y los compara con el usuario autenticado)
-
obtener cuerpo del token
-
mapear contenido del token
-
JwtAuthenticacionFilter:
-
Este servicio contiene el doFilterInternal que es el encargado de procesar las consultas realizadas, en este caso lo tengo configurado con toda la validacion del token antes mencionada usando las excepciones personalizadas del config.
-
getTokenFromRequest (request):
- Este metodo se encarga de extraer el token del header de autorizacion para generar las validaciones requeridas
JwtValidation:
- este servicio tiene el metodo encargado de validar el token y aparte dar una respuesta ya sea positiva o negativa
AuthService:
- Este servicio tiene como proposito generar las funciones tanto de autenticacion del usuario como el registro de usuario
UserService:
- Este servicio se encarga de retornar los datos requeridos del cuerpo del token y muestra tanto la respuesta de validacion de datos, y el cuerpo de respuesta con los datos del usuario
Model
UserRepository:
-
Repositorio para mongo con validacion de usuario:
- encontrar por nombre de usuario
- existencia por nombre de usuario
- existencia por correo electronico
User:
- Clase para generacion de Collection de usuarios con los campos de validacion con enumerated para el role y datos de profile, ademas validaciones por role
RoleName:
- Enum con la representacion de los roles en este caso USER y ADMIN
Endpoints
Ruta HTTP | Metodo HTTP | Descripcion |
---|---|---|
/api/v1/auth/register | POST | registro usuario nuevo |
/api/v1/auth/login | POST | autenticacion usuario registrado |
/api/v1/auth/userinfo | GET | lista datos usuario por token generado (requiere auth) |
/api/v1/auth/check | GET | valida el token enviado como autenticacion |
/api/v1/hello/any | GET | permite el acceso de cualquier usuario |
/api/v1/hello/user | GET | permite el acceso a solo usuarios autenticados |
/swagger-ui/index.html/ | documentacion endpoints |
Ejemplos JSON
-
/auth/register:
-
request
{ "firstname": "Victor", "lastname": "Perez", "phoneNumber": "612-138-2996", "country": "Polonia", "username": "vicpe", "email": "vicpe@sogou.com", "password": "123456" }
-
response
// se retorna el token { "token": "", "mensaje": "Usuario registrado exitosamente" }
-
excepcion
// username ya registrado { "token": null, "mensaje": "Usuario ya está registrado" } // email ya registrado { "token": null, "mensaje": "Correo electrónico ya está registrado" }
-
-
/auth/login:
-
register
{ "username": "robmen", "password": 123456 }
-
response
// se retorna el token { "token": "", "mensaje": "Inicio de sesión exitoso" }
-
excepcion
// username no existe { "token": null, "mensaje": "Usuario no encontrado" } // datos incorrectos { "token": null, "mensaje": "Credenciales incorrectas" }
-
-
/auth/userinfo:
-
register
{ "Authorization": "Bearer <token>" }
-
response
{ "mensaje": "El token es valido", "userRequest": { "role": "USER", "fullname": "Roberto Mendoza", "phoneNumber": "123-456-7890", "country": "Reino Unido", "username": "robmen", "email": "robmen@mail.com" } }
-
excepcion
// token ya expiro { "mensaje": "el token ha expirado" } // error firma de token { "mensaje": "La firma del token no es valida" }
-
-
/auth/check
-
register
{ "Authorization": "Bearer <token>" }
-
response
{ "message": "El token es valido", "role": "USER", "expirationDate": "27/03/2024 12:22 a. m." }
-
excepcion
// token ya expiro { "mensaje": "el token ha expirado" } // error firma de token { "mensaje": "La firma del token no es valida" }
-