Regras de cadastro
Parte da seção Autenticação e segurança do Journey de Node.js da Coddy. Lição 3 de 17.
No momento, qualquer pessoa pode se cadastrar duas vezes com o mesmo nome ou com a senha 1. O cadastro precisa verificar o que recebe antes de armazenar qualquer coisa.
Dois códigos de status indicam o que deu errado. 400 Bad Request significa que a própria solicitação não é aceitável, como uma senha curta demais. 409 Conflict significa que há um conflito com dados que você já tem, como um nome que já está em uso.
Os nomes também precisam ter uma única forma de escrita. Ada e ada parecem ser a mesma pessoa para quem os lê, então transforme um nome em minúsculas antes de armazená-lo e antes de pesquisá-lo:
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Desafio
FácilPOST /signupresponde com 400{ error }sem um nome de usuário ou com uma senha com menos de 8 caracteres.- Responde com 409
{ error }quando o nome de usuário já está em uso. - Os nomes de usuário são armazenados em letras minúsculas, e
POST /loginaceita qualquer combinação de maiúsculas e minúsculas.
Cadastre-se como Ada, depois como ada e, em seguida, faça login como ADA. Experimente também a senha 1234.
Experimente você mesmo
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 });
});
// Mostra o que o cadastro armazenou. Apenas para fins de aprendizado: um aplicativo real nunca teria essa rota.
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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.