Правила регистрации
Часть раздела Аутентификация и безопасность путешествия по Node.js на Coddy. Урок 3 из 17.
Сейчас любой может зарегистрироваться дважды под одним и тем же именем или с паролем 1. При регистрации нужно проверять полученные данные, прежде чем что-либо сохранять.
Два кода состояния показывают, что пошло не так. 400 Bad Request означает, что сам запрос недопустим, например, если пароль слишком короткий. 409 Conflict означает конфликт с уже имеющимися данными, например, если имя уже занято.
У имени также должно быть единое написание. Для всех, кто их читает, Ada и ada выглядят как имя одного и того же человека, поэтому перед сохранением имени и перед поиском по нему преобразуйте его в нижний регистр:
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Задание
ЛегкоPOST /signupвозвращает 400{ error }, если не указано имя пользователя или пароль короче 8 символов.- Он возвращает 409
{ error }, если имя пользователя уже занято. - Имена пользователей сохраняются в нижнем регистре, а
POST /loginпринимает их в любом регистре.
Зарегистрируй Ada, затем ada, а потом войди под именем ADA. Также попробуй пароль 1234.
Попробуйте сами
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 });
});
// Показывает, что сохранил signup. Только для обучения: в реальном приложении такого маршрута быть не должно.
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');
});
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.