Menu
CoddyTech

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

Wyzwanie

Łatwy

Obecnie 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.

  1. W pliku server.js, na początku POST /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ą.
  2. 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.
  3. Jeśli użytkownik o takiej oczyszczonej nazwie już istnieje, odpowiedz statusem 409 i {"error": "That username is taken"}.
  4. 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".
  5. W POST /login oczyść nazwę użytkownika w ten sam sposób, zanim jej wyszukasz. Dzięki temu ADA może zalogować się na konto ada.

Wypróbuj: Naciśnij „Uruchom”.

  • Wyślij POST /signup z {"username": "Ada", "password": "correct horse"}: status 201 i {"username": "ada"}.
  • Wyślij POST /signup z {"username": "ada", "password": "another password"}: status 409 i błąd „taken”.
  • Wyślij POST /login z {"username": "ADA", "password": "correct horse"}: status 200 i {"username": "ada"}.
  • Wyślij POST /signup z {"username": "bob", "password": "1234"}: status 400.
  • Wyślij POST /signup zawierają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');
});
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

Poćwicz samodzielnie: Edytor online Express