Menu
CoddyTech

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

Tantangan

Mudah

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

  1. Di server.js, pada awal POST /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.
  2. 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.
  3. Jika pengguna dengan nama yang sudah dibersihkan itu sudah ada, berikan respons dengan status 409 dan {"error": "That username is taken"}.
  4. Jika tidak, simpan pengguna dengan nama huruf kecil. Respons 201 menampilkan nama yang disimpan itu: {"username": "ada"}, bahkan jika permintaan menggunakan "Ada".
  5. Di POST /login, bersihkan nama pengguna dengan cara yang sama sebelum mencarinya. Dengan begitu, ADA bisa masuk ke akun ada.

Coba: Tekan Jalankan.

  • Kirim POST /signup dengan {"username": "Ada", "password": "correct horse"}: status 201 dan {"username": "ada"}.
  • Kirim POST /signup dengan {"username": "ada", "password": "another password"}: status 409 dan error "taken".
  • Kirim POST /login dengan {"username": "ADA", "password": "correct horse"}: status 200 dan {"username": "ada"}.
  • Kirim POST /signup dengan {"username": "bob", "password": "1234"}: status 400.
  • Kirim POST /signup hanya 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');
});
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Autentikasi dan Keamanan

Latihan sendiri: Playground Express