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' });
}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ì.
- Trong
server.js, ở đầuPOST /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. - 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. - 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"}. - 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". - 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 đó,ADAcó thể đăng nhập vào tài khoảnada.
Thử ngay: Nhấn Chạy.
- Gửi
POST /signupvới{"username": "Ada", "password": "correct horse"}: trạng thái 201 và{"username": "ada"}. - Gửi
POST /signupvới{"username": "ada", "password": "another password"}: trạng thái 409 và lỗi "taken". - Gửi
POST /loginvới{"username": "ADA", "password": "correct horse"}: trạng thái 200 và{"username": "ada"}. - Gửi
POST /signupvới{"username": "bob", "password": "1234"}: trạng thái 400. - Chỉ gửi
{"password": "correct horse"}trongPOST /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');
});
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