Menu
CoddyTech

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' });
}
challenge icon

Desafio

Fácil

No 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.

  1. Em server.js, no início de POST /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.
  2. 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.
  3. Quando já existir um usuário com esse nome limpo, responda com o status 409 e {"error": "That username is taken"}.
  4. 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".
  5. Em POST /login, limpe o nome de usuário da mesma forma antes de procurá-lo. Assim, ADA poderá entrar na conta ada.

Experimente: pressione Executar.

  • Envie POST /signup com {"username": "Ada", "password": "correct horse"}: status 201 e {"username": "ada"}.
  • Envie POST /signup com {"username": "ada", "password": "another password"}: status 409 e o erro "taken".
  • Envie POST /login com {"username": "ADA", "password": "correct horse"}: status 200 e {"username": "ada"}.
  • Envie POST /signup com {"username": "bob", "password": "1234"}: status 400.
  • Envie POST /signup somente 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');
});
quiz iconTeste seus conhecimentos

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