Menu
CoddyTech

Aturan Pendaftaran

Termasuk bagian Autentikasi dan Keamanan dalam perjalanan Node.js di Coddy. Pelajaran 3 dari 17.

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 masalah yang terjadi. 400 Bad Request berarti permintaannya sendiri tidak dapat diterima, seperti kata sandi yang terlalu pendek. 409 Conflict berarti permintaan bertentangan dengan data yang sudah kamu miliki, seperti nama yang sudah digunakan.

Nama juga harus memiliki satu ejaan. Ada dan ada tampak 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
  • POST /signup memberikan respons 400 { error } jika tidak ada username atau jika password kurang dari 8 karakter.
  • Responsnya 409 { error } untuk username yang sudah digunakan.
  • Username disimpan dalam huruf kecil, dan POST /login menerima huruf besar maupun kecil.

Daftar dengan Ada, lalu ada, kemudian login sebagai ADA. Coba juga password 1234.

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 data yang disimpan saat signup. Hanya untuk belajar: aplikasi sungguhan tidak pernah memiliki route 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