Menu
CoddyTech

Правила регистрации

Часть раздела Аутентификация и безопасность путешествия по Node.js на Coddy. Урок 7 из 24.

Сейчас любой может зарегистрироваться дважды с одним и тем же именем или с паролем 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' });
}
challenge icon

Задание

Легко

Сейчас любой может зарегистрироваться дважды под одним и тем же именем или с паролем 1. Добавь проверку полученных данных перед тем, как что-либо сохранять.

  1. В server.js, в начале POST /signup, очисти имя пользователя: удали пробелы вокруг него и переведи его в нижний регистр, чтобы " Ada " стало "ada". Если имя пользователя не указано, оно должно быть пустым.
  2. Всё ещё в POST /signup: если имя пустое или пароль содержит меньше 8 символов, верни статус 400 и {"error": "Pick a username and a password of at least 8 characters"}. Пароля ровно из 8 символов достаточно.
  3. Если пользователь с таким очищенным именем уже существует, верни статус 409 и {"error": "That username is taken"}.
  4. В противном случае сохрани пользователя под именем в нижнем регистре. В ответе 201 должно отображаться сохранённое имя: {"username": "ada"}, даже если в запросе было указано "Ada".
  5. В POST /login очисти имя пользователя таким же образом, прежде чем искать его. Тогда пользователь ADA сможет войти в аккаунт ada.

Попробуй: нажми «Запустить».

  • Отправь POST /signup с данными {"username": "Ada", "password": "correct horse"}: статус 201 и {"username": "ada"}.
  • Отправь POST /signup с данными {"username": "ada", "password": "another password"}: статус 409 и ошибка о том, что имя занято.
  • Отправь POST /login с данными {"username": "ADA", "password": "correct horse"}: статус 200 и {"username": "ada"}.
  • Отправь POST /signup с данными {"username": "bob", "password": "1234"}: статус 400.
  • Отправь POST /signup, указав только {"password": "correct horse"}: также статус 400.

Попробуйте сами

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');
});
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Аутентификация и безопасность

Потренируйтесь самостоятельно: Песочница Express