Saltar al contenido

Lección 8 de 12 · Lectura y práctica

Auth basica (sin inventar criptografia)

Distingue autenticación y autorización en una API Express y comprueba propiedad del recurso sin crear criptografía propia.

Del concepto a la práctica

Taller de esta lección

Autenticar identifica a la persona; autorizar comprueba si puede operar sobre ese recurso. El identificador enviado en la URL nunca demuestra propiedad: la aplicación debe usar la identidad establecida por un middleware de sesión o credencial verificada.

Ejemplo resuelto

js
async function obtenerNota(req,res) {
if (!req.user) return res.status(401).json({ ok: false, error: { code: 'UNAUTHORIZED' } });
const note = await notes.findById(req.params.id);
if (!note || note.ownerId !== req.user.id) {
  return res.status(404).json({ ok: false, error: { code: 'NOT_FOUND' } });
}
return res.json(note);

}

Con nota 12 propiedad de u1, u1 recibe 200 y u2 recibe 404 según este contrato que no revela si existe.

Datos completos: nota12={ownerId:"u1",texto:"Privada A"}, nota13={ownerId:"u2",texto:"Privada B"}. La asignación manual req.user pertenece exclusivamente al fixture de test: el servidor real verifica sesión/token y no acepta x-user ni ownerId como autoridad. Si tu repositorio permite filtrar por ID y propietario en una consulta, úsalo para reducir exposición. La política404 ante acceso ajeno debe documentarse.

Pruébalo

  1. Usa un middleware local que establezca req.user.id en pruebas.

  2. Crea dos notas con propietarios distintos.

  3. Comprueba acceso propio, ajeno y sin sesión.

Error frecuente: aceptar ownerId del body como autoridad. Corrige derivándolo de req.user.

Ejercicio: prueba nota 12 con u1, u2 y sin usuario.

Comprueba tu resultado

200, 404 y 401 respectivamente, sin implementar criptografía propia.

Capas de acceso, actualización, copias y respuesta a incidentes alrededor de un sistema.
CursaloMapa de práctica
La seguridad necesita varias capas

El control de acceso, las actualizaciones y las copias de seguridad cubren riesgos distintos. Una alerta necesita un procedimiento de respuesta para contener y recuperar el servicio. Varias capas reducen la exposición, pero ninguna garantiza seguridad absoluta.

Ver la infografía en tamaño completo ↗

Dos preguntas distintas

La autenticación identifica la sesión o credencial; la autorización decide si esa identidad puede actuar sobre un recurso. Conserva la idea de hash de contraseñas, sesiones o tokens y checks de propiedad. No implementes un algoritmo de cifrado ni confíes en un userId enviado por el cliente como prueba de identidad.

Caso ficticio: consultar una nota privada

A tiene una nota y B tiene otra. La ruta recibe un identificador de nota. El middleware de sesión verificado por la aplicación establece req.user.id; esta lección no inventa ese middleware ni presenta el fragmento como una solución completa de login.

// Ejemplo de autorización, después del middleware de sesión real.
app.get("/notes/:id", requireAuth, async (req, res, next) => {
  try {
    const note = await notes.findById(req.params.id);
    if (!note || note.ownerId !== req.user.id) {
      return res.status(404).json({ error: "Nota no disponible" });
    }
    return res.json({ id: note.id, title: note.title });
  } catch (error) {
    next(error);
  }
});

El ejemplo devuelve la misma respuesta cuando la nota no existe o no pertenece al usuario para no revelar su existencia. Otras APIs pueden tener un contrato distinto; documenta el tuyo y pruébalo. Aplica el control también a actualización y borrado, no solo a lectura.

Dónde revisar las credenciales

  • Usa una biblioteca mantenida para generar y verificar hashes; nunca almacenes contraseñas en texto plano.
  • Si la sesión usa cookies, revisa HTTPS, atributos apropiados, expiración y protección frente a peticiones cruzadas.
  • Si usas tokens, verifica firma, expiración y restricciones con una biblioteca; decodificar no equivale a validar.
  • No registres contraseñas, cookies o tokens en logs.
  • El almacenamiento y la estrategia dependen de la aplicación; este fragmento no decide todo el sistema de autenticación.

Matriz de práctica

PeticiónQué demostrar
Sin sesiónEl middleware rechaza el acceso
A consulta su notaSolo recibe campos públicos previstos
B consulta la nota de ANo obtiene contenido ni puede modificarla
ID ausenteRespuesta coherente con el contrato
Fallo del almacenamientoError controlado sin datos internos

Entrega una regla escrita, el punto del servidor donde se aplica y los resultados reales de esas pruebas en un proyecto de práctica. No consideres protegido un recurso porque el botón esté oculto o porque el navegador conserve una sesión.

Referencias para comprobar la implementación

Documentación consultada el 2 de octubre de 2026. Comprueba también las versiones y condiciones de tu proyecto.

Sigue con Node.js y APIs con Express

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.