Menu
CoddyTech

Reglas de registro

Parte de la sección Autenticación y seguridad del Journey de Node.js de Coddy. Lección 7 de 24.

Ahora mismo, cualquiera puede registrarse dos veces con el mismo nombre o con la contraseña 1. El registro debe comprobar lo que recibe antes de guardar nada.

Dos códigos de estado indican qué salió mal. 400 Solicitud incorrecta significa que la solicitud en sí no es aceptable, como una contraseña demasiado corta. 409 Conflicto significa que entra en conflicto con datos que ya tienes, como un nombre que ya está ocupado.

Los nombres también necesitan una única forma de escribirse. Ada y ada parecen referirse a la misma persona para cualquiera que los lea, así que convierte el nombre a minúsculas antes de guardarlo y antes de buscarlo:

const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
    return res.status(409).json({ error: 'Already subscribed' });
}
challenge icon

Desafío

Fácil

Ahora mismo, cualquiera puede registrarse dos veces con el mismo nombre o con la contraseña 1. Haz que el registro compruebe lo que recibe antes de guardar nada.

  1. En server.js, al inicio de POST /signup, limpia el nombre de usuario: quita los espacios que lo rodean y conviértelo a minúsculas, para que " Ada " se convierta en "ada". Si falta el nombre de usuario, debe quedar como un nombre vacío.
  2. También en POST /signup: cuando el nombre esté vacío o la contraseña tenga menos de 8 caracteres, responde con el estado 400 y {"error": "Pick a username and a password of at least 8 characters"}. Una contraseña de exactamente 8 caracteres tiene la longitud suficiente.
  3. Cuando ya exista un usuario con ese nombre limpio, responde con el estado 409 y {"error": "That username is taken"}.
  4. De lo contrario, guarda el usuario con el nombre en minúsculas. La respuesta 201 muestra el nombre guardado: {"username": "ada"}, incluso cuando la solicitud indicó "Ada".
  5. En POST /login, limpia el nombre de usuario de la misma manera antes de buscarlo. Así, ADA podrá iniciar sesión en la cuenta ada.

Pruébalo: Pulsa «Ejecutar».

  • Envía POST /signup con {"username": "Ada", "password": "correct horse"}: estado 201 y {"username": "ada"}.
  • Envía POST /signup con {"username": "ada", "password": "another password"}: estado 409 y el error "taken".
  • Envía POST /login con {"username": "ADA", "password": "correct horse"}: estado 200 y {"username": "ada"}.
  • Envía POST /signup con {"username": "bob", "password": "1234"}: estado 400.
  • Envía POST /signup solo con {"password": "correct horse"}: también estado 400.

Pruébalo tú mismo

import express from 'express';
import { users } from './db.js';
import { hashPassword, verifyPassword } from './passwords.js';

const app = express();
app.use(express.json());

app.post('/signup', async (req, res) => {
    const { username, password } = req.body;
    await users.insertOne({ username, passwordHash: await hashPassword(password) });
    res.status(201).json({ username });
});

app.post('/login', async (req, res) => {
    const { username, password } = req.body;
    const user = await users.findOne({ username });
    if (!user || !(await verifyPassword(password, user.passwordHash))) {
        return res.status(401).json({ error: 'Wrong username or password' });
    }
    res.json({ username: user.username });
});

// Muestra lo que almacenó signup. Solo con fines educativos: una aplicación real nunca tendría esta ruta.
app.get('/debug/users/:username', async (req, res) => {
    const user = await users.findOne({ username: req.params.username });
    res.json(user ? { username: user.username, passwordHash: user.passwordHash } : null);
});

app.listen(3000, () => {
    console.log('Vault is running on port 3000');
});
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Autenticación y seguridad

Practica por tu cuenta: Playground de Express