Menu
CoddyTech

Quy tắc đăng ký

Thuộc phần Xác thực và bảo mật trong hành trình Node.js của Coddy. Bài học 7 trên 24.

Hiện tại, bất kỳ ai cũng có thể đăng ký hai lần với cùng một tên hoặc dùng mật khẩu 1. Khi đăng ký, cần kiểm tra dữ liệu nhận được trước khi lưu bất cứ thứ gì.

Hai mã trạng thái cho biết lỗi xảy ra ở đâu. 400 Bad Request nghĩa là bản thân yêu cầu không hợp lệ, chẳng hạn như mật khẩu quá ngắn. 409 Conflict nghĩa là yêu cầu xung đột với dữ liệu đã có, chẳng hạn như tên đã có người dùng.

Tên cũng cần được viết thống nhất. Với người đọc, Ada và ada trông như cùng một người, vì vậy hãy chuyển tên thành chữ thường trước khi lưu và trước khi tra cứu:

const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
    return res.status(409).json({ error: 'Already subscribed' });
}
challenge icon

Thử thách

Dễ

Hiện tại, bất kỳ ai cũng có thể đăng ký hai lần với cùng một tên hoặc với mật khẩu 1. Hãy kiểm tra dữ liệu nhận được khi đăng ký trước khi lưu bất cứ thứ gì.

  1. Trong server.js, ở đầu POST /signup, hãy chuẩn hóa tên người dùng: xóa khoảng trắng ở hai đầu và chuyển thành chữ thường, để " Ada " trở thành "ada". Nếu thiếu tên người dùng, hãy dùng tên rỗng.
  2. Vẫn trong POST /signup: khi tên rỗng hoặc mật khẩu có ít hơn 8 ký tự, hãy trả về trạng thái 400 và {"error": "Pick a username and a password of at least 8 characters"}. Mật khẩu có đúng 8 ký tự là đủ dài.
  3. Khi đã có người dùng với tên đã chuẩn hóa đó, hãy trả về trạng thái 409 và {"error": "That username is taken"}.
  4. Nếu không, hãy lưu người dùng bằng tên chữ thường. Phản hồi trạng thái 201 hiển thị tên đã lưu: {"username": "ada"}, ngay cả khi yêu cầu gửi tên "Ada".
  5. Trong POST /login, hãy chuẩn hóa tên người dùng theo cách tương tự trước khi tìm kiếm. Sau đó, ADA có thể đăng nhập vào tài khoản ada.

Thử ngay: Nhấn Chạy.

  • Gửi POST /signup với {"username": "Ada", "password": "correct horse"}: trạng thái 201 và {"username": "ada"}.
  • Gửi POST /signup với {"username": "ada", "password": "another password"}: trạng thái 409 và lỗi "taken".
  • Gửi POST /login với {"username": "ADA", "password": "correct horse"}: trạng thái 200 và {"username": "ada"}.
  • Gửi POST /signup với {"username": "bob", "password": "1234"}: trạng thái 400.
  • Chỉ gửi {"password": "correct horse"} trong POST /signup: trạng thái 400.

Tự làm thử

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 });
});

// Hiển thị dữ liệu mà signup đã lưu. Chỉ dùng để học: ứng dụng thực tế không bao giờ có route này.
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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Xác thực và bảo mật

Tự luyện tập: Playground Express