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' });
}Desafío
FácilAhora 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.
- En
server.js, al inicio dePOST /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. - 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. - Cuando ya exista un usuario con ese nombre limpio, responde con el estado 409 y
{"error": "That username is taken"}. - 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". - En
POST /login, limpia el nombre de usuario de la misma manera antes de buscarlo. Así,ADApodrá iniciar sesión en la cuentaada.
Pruébalo: Pulsa «Ejecutar».
- Envía
POST /signupcon{"username": "Ada", "password": "correct horse"}: estado 201 y{"username": "ada"}. - Envía
POST /signupcon{"username": "ada", "password": "another password"}: estado 409 y el error "taken". - Envía
POST /logincon{"username": "ADA", "password": "correct horse"}: estado 200 y{"username": "ada"}. - Envía
POST /signupcon{"username": "bob", "password": "1234"}: estado 400. - Envía
POST /signupsolo 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');
});
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