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. 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, 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.
- Logger: Pino para el registro de logs.
- 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:
PORT=3000
HOST_DATABASE=localhost
POSTGRES_PORT=5432
POSTGRES_USER=tu-usuario
POSTGRES_PASSWORD=tu-contraseña
DATABASE=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 protected]
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=db
- 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:
auth/signUp
- Método:
POST
- Cuerpo:
{ "username": "nombre-de-usuario", "useremail": "[email protected]", "userpassword": "123456789" }
-
URL:
auth/signIn
-
Método:
POST
-
Cuerpo:
{ "useremail": "[email protected]", "userpassword": "123456789" }
-
URL:
auth/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:
auth/sendPasswordReset
-
Método:
POST
-
Cuerpo:
{ "useremail": "[email protected]" }
-
URL:
user/recoverPassword/:id
-
Método:
POST
-
Cuerpo:
{ "userpassword": "contraseña-nueva" }
-
URL:
auth/google
-
Método:
GET
-
Cuerpo: No aplica
-
URL:
auth/google/callback
-
Método:
GET
-
Cuerpo: No aplica
-
URL:
auth/github
-
Método:
GET
-
Cuerpo: No aplica
-
URL:
auth/github/callback
-
Método:
GET
-
Cuerpo: No aplica
Los roles pueden ser asignados a los usuarios y utilizados para proteger rutas específicas. Ejemplo de roles: admin
, member
.
@Auth(RoleEnum.ADMIN, RoleEnum.MEMBER)
@Post('recoverPassword/:id')
async recoverPassword(@Param('id') id: number, @Body() updatePassword: UpdatePasswordDto) {
return this.userService.recoverPassword(id, updatePassword);
}
El control de roles se realiza en el archivo src/shared/interfaces/user.interface.ts
. Este archivo define la interfaz de usuario y especifica los roles disponibles para asignar a los usuarios en la aplicación. Puedes modificar esta interfaz para agregar, eliminar o modificar roles según las necesidades de tu aplicación.
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.
-
Swagger: Se ha integrado Swagger para proporcionar una documentación interactiva de la API. puedes acceder a la documentacion en la ruta
localhost:3000/api
-
Asignación de contraseña: Los usuarios ahora pueden solicitar una actualización de contraseña. Al hacerlo, se genera una nueva contraseña automáticamente y se envía al correo electrónico del usuario. Además, el correo electrónico incluye un enlace que permite a los usuarios actualizar la contraseña manualmente según su preferencia.
-
Notificación de Ingreso desde Dispositivos Nuevos: Si un usuario inicia sesión desde un dispositivo o dirección IP diferente a la habitual, se envía un correo electrónico de notificación para informarles sobre el acceso desde un nuevo dispositivo.
-
Autenticación segura con múltiples proveedores: Permite a los usuarios iniciar sesión o registrarse utilizando sus cuentas de Google o Github.
-
Docker: Se ha implementado Docker para facilitar la creación de un entorno de desarrollo consistente y portátil. Sin embargo, esta característica está en fase experimental y puede requerir ajustes adicionales para un funcionamiento óptimo.
-
Actualización de contraseña Los usuarios pueden restablecer su contraseña enviando un email de verificación a su correo electronico.
-
Estructuración de archivos Se han realizados cambios en la estructura del proyecto.
- Refrescar Token: Los usuarios pueden refrescar su token de acceso cuando expire.
Este proyecto está licenciado bajo la Licencia MIT.