Aturan Pendaftaran
Termasuk bagian Autentikasi dan Keamanan dalam perjalanan Node.js di Coddy. Pelajaran 7 dari 24.
Saat ini siapa pun bisa mendaftar dua kali dengan nama yang sama, atau dengan kata sandi 1. Proses pendaftaran harus memeriksa data yang diterimanya sebelum menyimpan apa pun.
Dua kode status menunjukkan apa yang salah. 400 Permintaan Buruk berarti permintaannya sendiri tidak dapat diterima, seperti kata sandi yang terlalu pendek. 409 Konflik berarti terjadi benturan dengan data yang sudah kamu miliki, seperti nama yang sudah digunakan.
Nama juga perlu menggunakan satu ejaan. Ada dan ada terlihat seperti satu orang bagi siapa pun yang membacanya, jadi ubah nama menjadi huruf kecil sebelum menyimpannya dan sebelum mencarinya:
const email = String(req.body.email ?? '').trim().toLowerCase();
if (await subscribers.findOne({ email })) {
return res.status(409).json({ error: 'Already subscribed' });
}Tantangan
MudahSaat ini siapa pun bisa mendaftar dua kali dengan nama yang sama, atau dengan kata sandi 1. Buat proses pendaftaran memeriksa data yang diterima sebelum menyimpan apa pun.
- Di
server.js, pada awalPOST /signup, bersihkan nama pengguna: hapus spasi di sekelilingnya dan ubah menjadi huruf kecil, sehingga" Ada "menjadi"ada". Nama pengguna yang tidak ada akan menjadi nama kosong. - Masih di
POST /signup: jika nama kosong, atau kata sandi memiliki kurang dari 8 karakter, berikan respons dengan status 400 dan{"error": "Pick a username and a password of at least 8 characters"}. Kata sandi yang tepat 8 karakter sudah cukup panjang. - Jika pengguna dengan nama yang sudah dibersihkan itu sudah ada, berikan respons dengan status 409 dan
{"error": "That username is taken"}. - Jika tidak, simpan pengguna dengan nama huruf kecil. Respons 201 menampilkan nama yang disimpan itu:
{"username": "ada"}, bahkan jika permintaan menggunakan"Ada". - Di
POST /login, bersihkan nama pengguna dengan cara yang sama sebelum mencarinya. Dengan begitu,ADAbisa masuk ke akunada.
Coba: Tekan Jalankan.
- Kirim
POST /signupdengan{"username": "Ada", "password": "correct horse"}: status 201 dan{"username": "ada"}. - Kirim
POST /signupdengan{"username": "ada", "password": "another password"}: status 409 dan error "taken". - Kirim
POST /logindengan{"username": "ADA", "password": "correct horse"}: status 200 dan{"username": "ada"}. - Kirim
POST /signupdengan{"username": "bob", "password": "1234"}: status 400. - Kirim
POST /signuphanya dengan{"password": "correct horse"}: status 400 juga.
Coba sendiri
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 });
});
// Menampilkan apa yang disimpan saat signup. Hanya untuk belajar: aplikasi sungguhan tidak pernah memiliki rute ini.
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');
});
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Autentikasi dan Keamanan
Latihan sendiri: Playground Express