Zasady rejestracji
Część sekcji Uwierzytelnianie i bezpieczeństwo ścieżki Node.js w Coddy. Lekcja 7 z 24.
W tej chwili każdy może zarejestrować się dwa razy pod tą samą nazwą albo z hasłem 1. Podczas rejestracji trzeba sprawdzić otrzymane dane, zanim cokolwiek zostanie zapisane.
Dwa kody statusu informują o tym, co poszło nie tak. 400 Bad Request oznacza, że samo żądanie jest nieprawidłowe, na przykład hasło jest za krótkie. 409 Conflict oznacza konflikt z danymi, które już masz, na przykład gdy nazwa jest już zajęta.
Nazwy też muszą mieć jeden zapis. Ada i ada wyglądają jak ta sama osoba dla każdego, kto je czyta, więc zamień nazwę na małe litery przed jej zapisaniem i przed wyszukiwaniem:
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Wyzwanie
ŁatwyObecnie każdy może zarejestrować się dwa razy pod tą samą nazwą lub z hasłem 1. Spraw, aby rejestracja sprawdzała otrzymane dane, zanim cokolwiek zapisze.
- W pliku
server.js, na początkuPOST /signup, oczyść nazwę użytkownika: usuń otaczające ją spacje i zamień ją na małe litery, tak aby" Ada "zmieniło się w"ada". Brakująca nazwa użytkownika powinna być pustą nazwą. - Nadal w
POST /signup: jeśli nazwa jest pusta lub hasło ma mniej niż 8 znaków, odpowiedz statusem 400 i{"error": "Pick a username and a password of at least 8 characters"}. Hasło o długości dokładnie 8 znaków jest wystarczająco długie. - Jeśli użytkownik o takiej oczyszczonej nazwie już istnieje, odpowiedz statusem 409 i
{"error": "That username is taken"}. - W przeciwnym razie zapisz użytkownika pod nazwą zapisaną małymi literami. Odpowiedź 201 pokazuje zapisaną nazwę:
{"username": "ada"}, nawet jeśli w żądaniu podano"Ada". - W
POST /loginoczyść nazwę użytkownika w ten sam sposób, zanim jej wyszukasz. Dzięki temuADAmoże zalogować się na kontoada.
Wypróbuj: Naciśnij „Uruchom”.
- Wyślij
POST /signupz{"username": "Ada", "password": "correct horse"}: status 201 i{"username": "ada"}. - Wyślij
POST /signupz{"username": "ada", "password": "another password"}: status 409 i błąd „taken”. - Wyślij
POST /loginz{"username": "ADA", "password": "correct horse"}: status 200 i{"username": "ada"}. - Wyślij
POST /signupz{"username": "bob", "password": "1234"}: status 400. - Wyślij
POST /signupzawierające tylko{"password": "correct horse"}: również status 400.
Spróbuj swoich sił
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 });
});
// Pokazuje, co zapisano podczas rejestracji. Tylko do nauki: prawdziwa aplikacja nigdy nie udostępnia takiej trasy.
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');
});
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Uwierzytelnianie i bezpieczeństwo
Poćwicz samodzielnie: Edytor online Express