Regeln für die Registrierung
Teil des Abschnitts Authentifizierung und Sicherheit der Node.js-Journey von Coddy. Lektion 7 von 24.
Im Moment kann sich jeder zweimal mit demselben Namen oder mit dem Passwort 1 anmelden. Bei der Anmeldung muss geprüft werden, was empfangen wird, bevor etwas gespeichert wird.
Zwei Statuscodes geben an, was schiefgelaufen ist. 400 Bad Request bedeutet, dass die Anfrage selbst nicht zulässig ist, etwa wenn ein Passwort zu kurz ist. 409 Conflict bedeutet, dass sie mit bereits vorhandenen Daten kollidiert, etwa wenn ein Name bereits vergeben ist.
Namen müssen außerdem einheitlich geschrieben werden. Ada und ada sehen für alle, die sie lesen, wie dieselbe Person aus. Wandle einen Namen deshalb in Kleinbuchstaben um, bevor du ihn speicherst und bevor du danach suchst:
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Aufgabe
EinfachDerzeit kann sich jeder zweimal mit demselben Namen oder mit dem Passwort 1 registrieren. Lass die Registrierung überprüfen, was sie erhält, bevor sie etwas speichert.
- Bereinige in
server.jsam Anfang vonPOST /signupden Benutzernamen: Entferne die Leerzeichen darum herum und wandle ihn in Kleinbuchstaben um, sodass aus" Ada ""ada"wird. Ein fehlender Benutzername wird zu einem leeren Namen. - Ebenfalls in
POST /signup: Wenn der Name leer ist oder das Passwort weniger als 8 Zeichen hat, antworte mit Status 400 und{"error": "Pick a username and a password of at least 8 characters"}. Ein Passwort mit genau 8 Zeichen ist lang genug. - Wenn ein Benutzer mit diesem bereinigten Namen bereits existiert, antworte mit Status 409 und
{"error": "That username is taken"}. - Speichere den Benutzer andernfalls unter dem Namen in Kleinbuchstaben. Die 201-Antwort zeigt diesen gespeicherten Namen:
{"username": "ada"}, auch wenn die Anfrage"Ada"enthielt. - Bereinige in
POST /loginden Benutzernamen auf dieselbe Weise, bevor du danach suchst. Dann kann sichADAbeim Kontoadaanmelden.
Probiere es aus: Drücke auf „Ausführen“.
- Sende
POST /signupmit{"username": "Ada", "password": "correct horse"}: Status 201 und{"username": "ada"}. - Sende
POST /signupmit{"username": "ada", "password": "another password"}: Status 409 und die Fehlermeldung „taken“. - Sende
POST /loginmit{"username": "ADA", "password": "correct horse"}: Status 200 und{"username": "ada"}. - Sende
POST /signupmit{"username": "bob", "password": "1234"}: Status 400. - Sende
POST /signupnur mit{"password": "correct horse"}: ebenfalls Status 400.
Probier es selbst
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 });
});
// Zeigt, was bei der Registrierung gespeichert wurde. Nur zu Lernzwecken: Eine echte App hat diese Route niemals.
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');
});
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Authentifizierung und Sicherheit
1Passwörter
Bytes und Hex-TextEinen Passwortschlüssel ableitenEin neues SaltPasswörter niemals speichernSchlüssel-Bytes vergleichenEin Passwort überprüfenRegeln für die RegistrierungÜbe selbstständig: Express-Playground