Menu
CoddyTech

Reglas de registro

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

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 almacenar nada.

Dos códigos de estado indican qué salió mal. 400 Bad Request significa que la solicitud en sí no es aceptable, por ejemplo, si la contraseña es demasiado corta. 409 Conflict significa que entra en conflicto con datos que ya tienes, por ejemplo, si el nombre ya está en uso.

Los nombres también deben escribirse de una sola manera. Ada y ada parecen referirse a la misma persona para cualquiera que los lea, así que convierte el nombre a minúsculas antes de almacenarlo 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
  • POST /signup responde con 400 { error } si no se proporciona un nombre de usuario o si la contraseña tiene menos de 8 caracteres.
  • Responde con 409 { error } si el nombre de usuario ya está ocupado.
  • Los nombres de usuario se almacenan en minúsculas, y POST /login acepta cualquier combinación de mayúsculas y minúsculas.

Regístrate con Ada, después con ada y luego inicia sesión como ADA. Prueba también la contraseña 1234.

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 guardó signup. Solo con fines didácticos: una app real nunca tiene 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