Règles d’inscription
Fait partie de la section Authentification et sécurité du Journey Node.js de Coddy. Leçon 7 sur 24.
Pour l’instant, n’importe qui peut s’inscrire deux fois avec le même nom, ou avec le mot de passe 1. L’inscription doit vérifier ce qu’elle reçoit avant d’enregistrer quoi que ce soit.
Deux codes d’état indiquent ce qui n’a pas fonctionné. 400 Bad Request signifie que la requête elle-même n’est pas acceptable, par exemple si le mot de passe est trop court. 409 Conflict signifie qu’elle entre en conflit avec des données que vous avez déjà, par exemple si le nom est déjà pris.
Les noms doivent aussi avoir une seule orthographe. Ada et ada semblent désigner la même personne pour tous ceux qui les lisent. Mettez donc le nom en minuscules avant de l’enregistrer et avant de le rechercher :
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Défi
FacilePour l’instant, n’importe qui peut s’inscrire deux fois avec le même nom, ou avec le mot de passe 1. Fais en sorte que l’inscription vérifie les données reçues avant d’enregistrer quoi que ce soit.
- Dans
server.js, au début dePOST /signup, nettoie le nom d’utilisateur : supprime les espaces autour et convertis-le en minuscules, pour que" Ada "devienne"ada". Si le nom d’utilisateur est manquant, il devient un nom vide. - Toujours dans
POST /signup: si le nom est vide ou si le mot de passe comporte moins de 8 caractères, réponds avec le statut 400 et{"error": "Pick a username and a password of at least 8 characters"}. Un mot de passe de 8 caractères exactement est assez long. - Lorsqu’un utilisateur portant ce nom nettoyé existe déjà, réponds avec le statut 409 et
{"error": "That username is taken"}. - Sinon, enregistre l’utilisateur sous le nom en minuscules. La réponse 201 affiche le nom enregistré :
{"username": "ada"}, même si la requête indiquait"Ada". - Dans
POST /login, nettoie le nom d’utilisateur de la même manière avant de le rechercher. Ainsi,ADApeut se connecter au compteada.
Essaie : clique sur le bouton Run.
- Envoie
POST /signupavec{"username": "Ada", "password": "correct horse"}: statut 201 et{"username": "ada"}. - Envoie
POST /signupavec{"username": "ada", "password": "another password"}: statut 409 et l’erreur "taken". - Envoie
POST /loginavec{"username": "ADA", "password": "correct horse"}: statut 200 et{"username": "ada"}. - Envoie
POST /signupavec{"username": "bob", "password": "1234"}: statut 400. - Envoie
POST /signupavec seulement{"password": "correct horse"}: statut 400 également.
Essayez vous-même
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 });
});
// Affiche ce que signup a enregistré. À des fins pédagogiques uniquement : une vraie application n'a jamais cette 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');
});
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Authentification et sécurité
Entraînez-vous par vous-même : Playground Express