Menu
CoddyTech

Regole di registrazione

Fa parte della sezione Autenticazione e sicurezza del percorso Node.js di Coddy. Lezione 3 di 17.

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

Due codici di stato indicano cosa è andato storto. 400 Bad Request significa che la richiesta stessa non è accettabile, ad esempio se la password è troppo corta. 409 Conflict significa che c'è un conflitto con dati che hai già, ad esempio se il nome è già utilizzato.

Anche i nomi devono avere un'unica grafia. Ada e ada sembrano la stessa persona a chiunque li legga, quindi converti un nome in minuscolo prima di memorizzarlo 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
  • POST /signup restituisce 400 { error } se manca un nome utente o se la password contiene meno di 8 caratteri.
  • Restituisce 409 { error } se il nome utente è già in uso.
  • I nomi utente vengono salvati in minuscolo e POST /login accetta qualsiasi combinazione di maiuscole e minuscole.

Registrati con Ada, poi con ada, quindi accedi come ADA. Prova anche la password 1234.

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