Menu
CoddyTech

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' });
}
challenge icon

Wyzwanie

Łatwy
  • POST /signup zwraca 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 /login akceptuje 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');
});
quiz iconSprawdź się

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