Proyecto de ejecución de tareas
Go to file
Jonathan Rodriguez 848fbb0eb1 commit initial
2024-07-16 10:36:19 -06:00
README.md commit initial 2024-07-16 10:36:19 -06:00

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"
      }