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.
- 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.
- 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.
- Node.js (v14 o superior)
- PostgreSQL
- npm o yarn
- Docker (opcional, pero recomendado para el desarrollo y despliegue con contenedores)
- Clona el repositorio:
git clone https://github.com/JuanjoCodedev/auth-nest.git
- 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
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
- 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.
- 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
- El servidor estará disponible en
http://localhost:3000
tambien puedes ingesarhttp://localhost:3000/api
para el uso de Swagger.
- URL:
sign-up/signUp
- Método:
POST
- Cuerpo:
{ "name": "nombre-de-usuario", "email": "correo@ejemplo.com", "password": "123456789" }
-
URL:
sign-in/signIn
-
Método:
POST
-
Cuerpo:
{ "email": "correo@ejemplo.com", "password": "123456789" }
-
URL:
token/refreshToken
-
Método:
POST
-
Cuerpo:
{ "refreshToken": "antiguo_token" }
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" }
-
URL:
reset-password/sendPasswordReset
-
Método:
POST
-
Cuerpo:
{ "email": "correo@ejemplo.com" }
-
URL:
user/recoverPassword/:id
-
Método:
POST
-
Cuerpo:
{ "password": "contraseña-nueva" }
-
URL:
with-provider/google
-
Método:
GET
-
Cuerpo: No aplica
-
URL:
with-provider/google/callback
-
Método:
GET
-
Cuerpo: No aplica
-
URL:
with-provider/github
-
Método:
GET
-
Cuerpo: No aplica
-
URL:
with-provider/github/callback
-
Método:
GET
-
Cuerpo: No aplica
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.
-
URL:
roles/newRol
-
Método:
POST
-
Cuerpo:
{ "name": "deve" }
-
URL:
permissions/newPermission
-
Método:
POST
-
Cuerpo:
{ "route": "/user/profile/:id" }
-
URL:
rp/newrp
-
Método:
POST
-
Cuerpo:
{ "id_rol": 1, "id_permissions": 1 }
npm run build-and-start
npm run build
npm run start:prod
-
Haz un fork del repositorio.
-
Crea una nueva rama:
git checkout -b feature/nueva-caracteristica
- Realiza tus cambios y haz commit:
git commit -am 'Añadir nueva característica'
- Empuja tus cambios a la rama:
git push origin feature/nueva-caracteristica
- Abre un Pull Request en GitHub, describiendo los cambios propuestos.
Este proyecto está licenciado bajo la Licencia MIT.