Skip to content

🚀 Sistema de autenticación con Google y GitHub, gestión de roles, y extensión de sesión con refresh tokens. 🧑‍🚀

License

Notifications You must be signed in to change notification settings

JuanjoCodedev/auth-nest

Repository files navigation

Proyecto de Registro e Inicio de Sesión con Roles

Este proyecto es una aplicación de autenticación que permite a los usuarios registrarse, iniciar sesión y acceder a recursos basados en roles con permisos especificos. Utiliza PostgreSQL como base de datos.

Características

  • Permite a los usuarios crear una cuenta en el sistema.
  • Los usuarios pueden iniciar sesión en la aplicación utilizando sus credenciales con notificación por correo electrónico para accesos desde dispositivos diferentes a los habituales.
  • Actualización de contraseña con generación automática y opción de actualización manual a través de un enlace en el correo electrónico.
  • Permite asignar roles específicos a los usuarios para gestionar sus permisos y acceso dentro de la aplicación.
  • Las rutas de la aplicación están protegidas según el rol del usuario y el permiso que este tenga, asegurando que solo los usuarios con permisos adecuados puedan acceder a ciertas áreas.
  • Utiliza JSON Web Tokens (JWT) para la autenticación segura de usuarios.
  • Implementa refresh tokens para mantener la sesión activa y permitir una conexión fluida sin necesidad de reautenticación constante.
  • Permite a los usuarios iniciar sesión o registrarse utilizando sus cuentas de Google o Github para una experiencia de autenticación más conveniente.
  • Utiliza Handlebars para generar plantillas de correo electrónico dinámicas, facilitando el envío de correos personalizados y bien formateados.

Tecnologías Utilizadas

  • Backend: NestJS.
  • Base de datos: PostgreSQL.
  • Autenticación: JWT (JSON Web Tokens), Passport.
  • Hashing de contraseñas: bcrypt.
  • Envios de correos electrónicos: Mailer.
  • CORS: Para el manejo de solicitudes entre dominios.
  • Plantillas de correo electrónico: Handlebars.
  • Contenedores: Docker para el despliegue y gestión de contenedores.
  • Documentación de API: Swagger para la generación de documentación de API.

Requisitos Previos

  • Node.js (v14 o superior)
  • PostgreSQL
  • npm o yarn
  • Docker (opcional, pero recomendado para el desarrollo y despliegue con contenedores)

Instalación

  1. Clona el repositorio:
git clone https://github.com/JuanjoCodedev/auth-nest.git
  1. Configura la base de datos PostgreSQL y crea un archivo .dev.env en la raíz del proyecto con la siguiente configuración:
NODE_ENV=modo-de-trabajo development | production

LOG_LEVEL=debug | info

PORT=3000
HOST_DATABASE_DEVELOPMENT=localhost
POSTGRES_PORT_DEVELOPMENT=5432
POSTGRES_USER_DEVELOPMENT=tu-usuario
POSTGRES_PASSWORD_DEVELOPMENT=tu-contraseña
DATABASE_DEVELOPMENT=nombre-de-tu-base-de-datos

HOST_DATABASE_PRODUCTION=localhost
POSTGRES_PORT_PRODUCTION=5432
POSTGRES_USER_PRODUCTION=tu-usuario
POSTGRES_PASSWORD_PRODUCTION=tu-contraseña
DATABASE_PRODUCTION=nombre-de-tu-base-de-datos

SECRET_KEY=SECRET_KEY
EXPIRED_TOKEN=tiempo-expiracion-del-token
EXPIRED_REFRESH_TOKEN=tiempo-expiracion-del-refresh-token

MAILER_HOST=smtp.gmail.com
MAILER_PORT=465
MAILER_SECURE=true
MAILER_NAME=tu-marca
MAILER_USER=email-remitente@example.com
MAILER_PASS=tu-contraseña-app-google

GOOGLE_CLIENT_ID=tu-client-id-google
GOOGLE_CLIENT_SECRET=tu-client-secret-google
GOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/callback

GITHUB_CLIENT_ID=tu-client-id-GITHUB
GITHUB_CLIENT_SECRET=tu-client-secret-GITHUB
GITHUB_CALLBACK_URL=http://localhost:3000/auth/github/callback

Observación

Si vas a utiizar Docker en vez de implementar:

HOST_DATABASE=localhost

se recomienda utilizar:

HOST_DATABASE_DEVELOPMENT=db

Nota: remplace las variables de entorno del archivo .dev.env por las credenciales colocadas en su docker-compose:

HOST_DATABASE_DEVELOPMENT=db
POSTGRES_PORT_DEVELOPMENT=5432
POSTGRES_USER_DEVELOPMENT=root
POSTGRES_PASSWORD_DEVELOPMENT=root
DATABASE_DEVELOPMENT=root

Uso

  1. Opción A: Ejecución con Docker
  • Asegúrate de tener Docker instalado en tu sistema. Puedes descargarlo desde Docker Hub.

  • Crea un archivo .dev.env en la raíz del proyecto con la configuración de la base de datos y otras variables de entorno necesarias, si no lo haces no te podra ejecutar el comando correctamente (consulta los pasos de instalación #2 .dev.env sigue los pasos).

  • Ejecuta el siguiente comando en la raíz del proyecto para construir y ejecutar los contenedores de Docker:

docker-compose up --build

Esto creará e iniciará los contenedores necesarios para ejecutar la aplicación, incluyendo la base de datos PostgreSQL y la interfaz de administración Adminer, para crear la tabla solo dirigete a la URL: localhost:8080.

  1. Opción B: Ejecución sin Docker
  • Asegúrate de tener PostgreSQL instalado y configurado en tu sistema.

  • Crea un archivo .dev.env en la raíz del proyecto con la configuración de la base de datos y otras variables de entorno necesarias (consulta los pasos de instalación #2 .dev.env sigue los pasos).

  • Instala las dependencias del proyecto:

npm install
  • Inicia el servidor con el siguiente comando para probar el envio de correo electronicos en desarrollo:
npm run build-and-start
  • Inicia el servidor con el siguiente comando para desarrollo:
npm run start:dev
  1. El servidor estará disponible en http://localhost:3000 tambien puedes ingesar http://localhost:3000/api para el uso de Swagger.

Endpoints

Registro de Usuario

  • URL: sign-up/signUp
  • Método: POST
  • Cuerpo:
    {
      "name": "nombre-de-usuario",
      "email": "correo@ejemplo.com",
      "password": "123456789"
    }

Inicio de Sesión

  • URL: sign-in/signIn

  • Método: POST

  • Cuerpo:

    {
      "email": "correo@ejemplo.com",
      "password": "123456789"
    }

    Refrescar Token

  • URL: token/refreshToken

  • Método: POST

  • Cuerpo:

    {
      "refreshToken": "antiguo_token"
    }

    Observación

    Para refrescar el token desde el frontend, asegúrate de incluir el encabezado x-refresh-token con el valor del token de actualización (refresh token) en tu solicitud HTTP.

    {
      "x-refresh-token": "refreshToken"
    }

Enviar token por correo electrónico

  • URL: reset-password/sendPasswordReset

  • Método: POST

  • Cuerpo:

    {
      "email": "correo@ejemplo.com"
    }

Actualizar contraseña

  • URL: user/recoverPassword/:id

  • Método: POST

  • Cuerpo:

    {
      "password": "contraseña-nueva"
    }

Validación con Google

  • URL: with-provider/google

  • Método: GET

  • Cuerpo: No aplica

  • URL: with-provider/google/callback

  • Método: GET

  • Cuerpo: No aplica

Validación con Github

  • URL: with-provider/github

  • Método: GET

  • Cuerpo: No aplica

  • URL: with-provider/github/callback

  • Método: GET

  • Cuerpo: No aplica

Roles

Los roles pueden ser asignados a los usuarios y utilizados para proteger rutas específicas. Además podras asignar permisos a roles especificos. Ejemplo de roles: admin, member.

@Auth()
@Post('recoverPassword/:id')
async recoverPassword(@Param('id') id: number, @Body() updatePassword: UpdatePasswordDto) {
    return this.userService.recoverPassword(id, updatePassword);
  }

En ese ejemplo, se importa el decorador @Auth() que se encargara de validar si la persona tiene asigando un rol y si ese rol tiene permiso para acceder a esa ruta.

Registrar nuevo Rol

  • URL: roles/newRol

  • Método: POST

  • Cuerpo:

    {
      "name": "deve"
    }

Registrar nuevo Permiso

  • URL: permissions/newPermission

  • Método: POST

  • Cuerpo:

    {
      "route": "/user/profile/:id"
    }

Asignar permiso a Rol

  • URL: rp/newrp

  • Método: POST

  • Cuerpo:

    {
      "id_rol": 1,
      "id_permissions": 1
    }

Desarrollo

Ejecución de la Aplicación en Desarrollo

npm run build-and-start

Compilación y Ejecución en Producción

npm run build
npm run start:prod

Diagrama de Flujo

Diagrama ER

Contribución

  1. Haz un fork del repositorio.

  2. Crea una nueva rama:

git checkout -b feature/nueva-caracteristica
  1. Realiza tus cambios y haz commit:
git commit -am 'Añadir nueva característica'
  1. Empuja tus cambios a la rama:
git push origin feature/nueva-caracteristica
  1. Abre un Pull Request en GitHub, describiendo los cambios propuestos.

Lincencia

Este proyecto está licenciado bajo la Licencia MIT.

About

🚀 Sistema de autenticación con Google y GitHub, gestión de roles, y extensión de sesión con refresh tokens. 🧑‍🚀

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published