express-authrouter
v3.2.0
Published
paquete para proporcionar rutas de autenticación de usuarios utilizando Express, Prisma y JWT
Downloads
12
Maintainers
Readme
Express-authrouter
Este paquete npm proporciona una implementación sencilla y reutilizable de rutas de autenticación (registro y login) utilizando Express y Prisma ORM. Está diseñado para ser fácilmente integrado en proyectos existentes.
Dependencias
Este proyecto utiliza las siguientes dependencias clave:
- bcrypt
- express
- express-validator
- jsonwebtoken
- prisma ORM
Instalación
Para instalar el paquete, ejecuta el siguiente comando:
npm install express-authrouter
Uso
Auth
Constructor
prismaObj
: Instancia del PrismaClient.secret
: Clave secreta para la generación de tokens JWT.identities[]
: Listado de campos unicos del usuario, puede ser uno o varios (e.g., [username
,email
]).
Métodos
protect()
: Devuelve un middleware para verificar tokens JWT.routes()
: Configura y devuelve las rutas de autenticación (/register
y/login
).result()
: middleware de Express que se utiliza para manejar los resultados de validación de express-validator
Configuración Básica
Prisma schema
(solo un ejemplo)
model user {
id Int @id @defautl(autoincrement())
username String @unique() // required
name String
lastname String?
password String // required
}
el campo identities al ser dinamico se puede usar cualquier atributo de identificación unico dentro del modelo, el modelo tambien puede contener los atributos que desees aparte de estos, no es restrictivo.
En este caso vamos a trabajar con el atributo 'username'
Primero, importa la clase Auth
y Prisma Client en tu aplicación:
import Auth from 'express-authrouter';
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
const auth = new Auth(prisma, process.env.YOUR_SECRET, ['username']);
otro uso con multiples campos unicos
const auth = new Auth(prisma, process.env.YOUR_SECRET, ['username', 'email']);
Rutas de Autenticación
Agrega las rutas de autenticación a tu aplicación:
app.use('/auth', auth.routes());
Esto añadirá las siguientes rutas a tu servidor:
POST /register: Maneja el registro de un nuevo usuario.
Request Body:
identities[]
: Identificadores únicos del usuario que fueron definidos en el array identities, en este caso solo es usernamepassword
: Contraseña del usuario.
{ "username":"some username", "password":"some password", "...other fields" }
en caso de tener mas campos unicos ej:
['username', 'email']
{ "username":"some username", "email":"some email", "password":"some password", "...other fields" }
Responses:
200 OK: Registro exitoso, devuelve un token JWT.
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
409 Conflict: El nombre de usuario/email ya esta tomado. (en caso de tener varios identities estos van a ser validados automaticamente)
{ "error": "username is already taken" }
nota
tanto la contraseña, como los campos que se marquen como identities se validaran de forma nativa, los demas campos deberan ser validados externamente (el paquete ofrece una facil implementacion con express-validator)
400 bad request: faltan campos
{ "error": "password is required" }
500 Internal Server Error: Error en el servidor.
{ "error": "error message..." }
POST /auth/login: Maneja la autenticación de un usuario existente.
Request Body:
el valor que se pasa para el login es el primer elemento de el array de identities, por ejemplo, si nuestro array es
['username', 'email']
, el valor que se usara para loguearse es usernameusername
: Identificador único del usuario.password
: Contraseña del usuario.campos adicionales
: la request admite mas campos en caso de que nuestro modelo cuente con campos adicionales, opcionales o requeridos
{ "username":"some username", "password":"some password", "other_fields":"some other fields" }
Responses:
- 200 OK: Autenticación exitosa, devuelve un token JWT.
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
- 400 bad request: faltan campos
{ "error": "password is required" }
- 401 Unauthorized: Contraseña incorrecta.
{ "error": "incorrect password" }
- 404 Not Found: El usuario no existe.
{ "error": "user not found" }
- 500 Internal Server Error: Error en el servidor.
{ "error": "error message..." }
- 200 OK: Autenticación exitosa, devuelve un token JWT.
Middleware de Protección de Rutas
Puedes proteger rutas utilizando el método protect()
:
app.use('/ruta-protegida', auth.protect(), (req, res) => {
res.send('ruta protegida');
});
auth.protect()
Middleware para verificar el token JWT en las peticiones.
Request body:
headers:
{token: example.token}
Responses:
- 200 OK: Token válido, se permite el acceso a la ruta protegida.
- 403 Forbidden: No se proporcionó token.
{ "message": "no token provided" }
- 401 Unauthorized: Token inválido o expirado.
{ "error": "invalid token" }
Default Middlewares
los siguientes middlewares ya se aplican por defecto en las rutas de login y registro.
userModelExists()
Middleware para verificar si la tabla de usuarios existe en la base de datos.
- Responses:
- 500 Internal Server Error: La tabla
user
no existe o se produjo otro error.{ "error": "the table user/users don't exists" }
- 500 Internal Server Error: La tabla
checkUserExists()
es un middleware de Express que se utiliza para comprobar si un usuario existe en la base de datos basándose en identidades proporcionadas.
Responses:
400 bad request: Se devuelve este código de error y mensaje cuando faltan identidades necesarias en la solicitud.
{ "error": "email, username are required" }
409 Código de error: Se devuelve este código de error y mensaje cuando se trata de registrar un usuario con un identity que ya existe en base de datos
{ "error": "email is already taken" }
500 Código de error: Se devuelve este código de error y mensaje cuando se produce un error durante el proceso de verificación de la existencia del usuario.
{ "error": "An error occurred while checking user existence" }
Implementacion de express-validator auth.result()
npm install express-validator
El paquete ofrece un Middleware para validar la estructura de la solicitud en las rutas de autenticación. para los campos ademas de el password y aquellos que no sean unicos (array de identities)
y se puede implementar de la siguiente manera:
digamos que tienes un campo que no es unico llamado name
en tu modelo
const registerValidationRules = [
body('name')
.notEmpty()
.withMessage('name is required'),
(req, res, next) => {
auth.result(req,res,next)
},
];
app.use('/', registerValidationRules ,(req,res) => {
res.send('Example route');
});
- Responses:
- 400 Bad Request: En caso de que no se cumpla con las validaciones se da la siguiente respuesta
{ "errors": [ { "msg": "name is required", "param": "name", "location": "body" }, ] }
- 400 Bad Request: En caso de que no se cumpla con las validaciones se da la siguiente respuesta
aplicar express-validator para los campos definidos dentro de el arrat identities no es necesario, ya que estos se validan, pero se pueden hacer validaciones adicionales con express-validator
Contribuciones
Si deseas contribuir a este paquete, por favor abre un pull request o reporta un issue.
Licencia
Este proyecto está bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.