npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

express-authrouter

v3.2.0

Published

paquete para proporcionar rutas de autenticación de usuarios utilizando Express, Prisma y JWT

Downloads

12

Readme

Express-authrouter

Made with Prismaexpressnodejsjwtjsjson

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 username
    • password: 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 username

    • username: 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..."
      }

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"
      }

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"
          },
        ]
      }

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.