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' });
}Sfida
FacileAl 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.
- In
server.js, all'inizio diPOST /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. - 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. - Se esiste già un utente con quel nome ripulito, rispondi con lo stato 409 e
{"error": "That username is taken"}. - Altrimenti, salva l'utente con il nome in minuscolo. La risposta 201 mostra il nome salvato:
{"username": "ada"}, anche quando la richiesta conteneva"Ada". - In
POST /login, ripulisci il nome utente nello stesso modo prima di cercarlo. CosìADApuò accedere all'accountada.
Prova: premi «Gioca».
- Invia
POST /signupcon{"username": "Ada", "password": "correct horse"}: stato 201 e{"username": "ada"}. - Invia
POST /signupcon{"username": "ada", "password": "another password"}: stato 409 e l'errore "taken". - Invia
POST /logincon{"username": "ADA", "password": "correct horse"}: stato 200 e{"username": "ada"}. - Invia
POST /signupcon{"username": "bob", "password": "1234"}: stato 400. - Invia anche
POST /signupcon 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');
});
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