- Notifications
You must be signed in to change notification settings - Fork6
🚀 Sistema de autenticación con Google y GitHub, gestión de roles, y extensión de sesión con refresh tokens. 🧑🚀
License
JuanjoCodedev/auth-nest
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
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 | productionLOG_LEVEL=debug | infoPORT=3000HOST_DATABASE_DEVELOPMENT=localhostPOSTGRES_PORT_DEVELOPMENT=5432POSTGRES_USER_DEVELOPMENT=tu-usuarioPOSTGRES_PASSWORD_DEVELOPMENT=tu-contraseñaDATABASE_DEVELOPMENT=nombre-de-tu-base-de-datosHOST_DATABASE_PRODUCTION=localhostPOSTGRES_PORT_PRODUCTION=5432POSTGRES_USER_PRODUCTION=tu-usuarioPOSTGRES_PASSWORD_PRODUCTION=tu-contraseñaDATABASE_PRODUCTION=nombre-de-tu-base-de-datosSECRET_KEY=SECRET_KEYEXPIRED_TOKEN=tiempo-expiracion-del-tokenEXPIRED_REFRESH_TOKEN=tiempo-expiracion-del-refresh-tokenMAILER_HOST=smtp.gmail.comMAILER_PORT=465MAILER_SECURE=trueMAILER_NAME=tu-marcaMAILER_USER=email-remitente@example.comMAILER_PASS=tu-contraseña-app-googleGOOGLE_CLIENT_ID=tu-client-id-googleGOOGLE_CLIENT_SECRET=tu-client-secret-googleGOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/callbackGITHUB_CLIENT_ID=tu-client-id-GITHUBGITHUB_CLIENT_SECRET=tu-client-secret-GITHUBGITHUB_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 sudocker-compose
:
HOST_DATABASE_DEVELOPMENT=dbPOSTGRES_PORT_DEVELOPMENT=5432POSTGRES_USER_DEVELOPMENT=rootPOSTGRES_PASSWORD_DEVELOPMENT=rootDATABASE_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 laURL: 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')asyncrecoverPassword(@Param('id')id: number, @Body()updatePassword:UpdatePasswordDto){returnthis.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 buildnpm 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.
About
🚀 Sistema de autenticación con Google y GitHub, gestión de roles, y extensión de sesión con refresh tokens. 🧑🚀