Zasady rejestracji
Część sekcji Uwierzytelnianie i bezpieczeństwo ścieżki Node.js w Coddy. Lekcja 3 z 17.
Obecnie 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 niedopuszczalne, na przykład gdy hasło jest zbyt 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ć jednolitą pisownię. Ada i ada wyglądają dla wszystkich czytających je osób jak ta sama osoba, więc przed zapisaniem nazwy i przed jej wyszukaniem zamień ją na małe litery:
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Wyzwanie
ŁatwyPOST /signupzwraca 400{ error }bez nazwy użytkownika lub gdy hasło ma mniej niż 8 znaków.- Zwraca 409
{ error }, gdy nazwa użytkownika jest zajęta. - Nazwy użytkowników są przechowywane małymi literami, a
POST /loginakceptuje dowolną wielkość liter.
Zarejestruj się jako Ada, następnie jako ada, a potem zaloguj się jako ADA. Wypróbuj też hasło 1234.
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 zapisał signup. Tylko do nauki: prawdziwa aplikacja nigdy nie udostępnia takiej ścieżki.
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
4Właściciele i bezpieczeństwo
Tylko twoje notatkiRole administratora