Regras de cadastro
Parte da seção Autenticação e segurança do Journey de Node.js da Coddy. Lição 7 de 24.
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 todos que os leem, então converta um nome para minúsculas antes de armazená-lo e antes de consultá-lo:
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Desafio
FácilNo momento, qualquer pessoa pode se cadastrar duas vezes com o mesmo nome ou com a senha 1. Faça o cadastro verificar o que recebe antes de salvar qualquer coisa.
- Em
server.js, no início dePOST /signup, limpe o nome de usuário: remova os espaços ao redor dele e converta-o para minúsculas, de modo que" Ada "se torne"ada". Se o nome de usuário estiver ausente, use um nome vazio. - Ainda em
POST /signup: quando o nome estiver vazio ou a senha tiver menos de 8 caracteres, responda com o status 400 e{"error": "Pick a username and a password of at least 8 characters"}. Uma senha com exatamente 8 caracteres é longa o suficiente. - Quando já existir um usuário com esse nome limpo, responda com o status 409 e
{"error": "That username is taken"}. - Caso contrário, salve o usuário com o nome em letras minúsculas. A resposta 201 mostra o nome salvo:
{"username": "ada"}, mesmo quando a solicitação dizia"Ada". - Em
POST /login, limpe o nome de usuário da mesma forma antes de procurá-lo. Assim,ADApoderá entrar na contaada.
Experimente: pressione Executar.
- Envie
POST /signupcom{"username": "Ada", "password": "correct horse"}: status 201 e{"username": "ada"}. - Envie
POST /signupcom{"username": "ada", "password": "another password"}: status 409 e o erro "taken". - Envie
POST /logincom{"username": "ADA", "password": "correct horse"}: status 200 e{"username": "ada"}. - Envie
POST /signupcom{"username": "bob", "password": "1234"}: status 400. - Envie
POST /signupsomente com{"password": "correct horse"}: status 400 também.
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.
Todas as lições de Autenticação e segurança
Pratique por conta própria: Playground de Express