Menu
CoddyTech

Regole di registrazione

Fa parte della sezione Autenticazione e sicurezza del percorso Node.js di Coddy. Lezione 7 di 24.

Al momento chiunque può registrarsi due volte con lo stesso nome, oppure con la password 1. La registrazione deve controllare ciò che riceve prima di salvare qualsiasi cosa.

Due codici di stato indicano cosa è andato storto. 400 Bad Request significa che la richiesta stessa non è accettabile, per esempio perché la password è troppo corta. 409 Conflict significa che è in conflitto con dati che hai già, per esempio perché il nome è già occupato.

Anche i nomi devono avere un'unica grafia. Ada e ada sembrano indicare la stessa persona a chiunque li legga, quindi converti un nome in minuscolo prima di salvarlo e prima di cercarlo:

const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
    return res.status(409).json({ error: 'Already subscribed' });
}
challenge icon

Sfida

Facile

Al momento chiunque può registrarsi due volte con lo stesso nome o con la password 1. Fai in modo che la registrazione controlli i dati ricevuti prima di salvare qualsiasi cosa.

  1. In server.js, all'inizio di POST /signup, ripulisci il nome utente: rimuovi gli spazi intorno e trasformalo in minuscolo, così " Ada " diventa "ada". Se manca il nome utente, usa un nome vuoto.
  2. Sempre in POST /signup: se il nome è vuoto o la password ha meno di 8 caratteri, rispondi con lo stato 400 e {"error": "Pick a username and a password of at least 8 characters"}. Una password di esattamente 8 caratteri è abbastanza lunga.
  3. Se esiste già un utente con quel nome ripulito, rispondi con lo stato 409 e {"error": "That username is taken"}.
  4. Altrimenti, salva l'utente con il nome in minuscolo. La risposta 201 mostra il nome salvato: {"username": "ada"}, anche quando la richiesta conteneva "Ada".
  5. In POST /login, ripulisci il nome utente nello stesso modo prima di cercarlo. Così ADA può accedere all'account ada.

Prova: premi «Gioca».

  • Invia POST /signup con {"username": "Ada", "password": "correct horse"}: stato 201 e {"username": "ada"}.
  • Invia POST /signup con {"username": "ada", "password": "another password"}: stato 409 e l'errore "taken".
  • Invia POST /login con {"username": "ADA", "password": "correct horse"}: stato 200 e {"username": "ada"}.
  • Invia POST /signup con {"username": "bob", "password": "1234"}: stato 400.
  • Invia anche POST /signup con solo {"password": "correct horse"}: stato 400.

Provalo tu

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 ciò che signup ha salvato. Solo a scopo didattico: un'app reale non ha mai questa route.
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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Autenticazione e sicurezza

Esercitati da solo: Playground Express