Menu
CoddyTech

قواعد التسجيل

جزء من قسم المصادقة والأمان في رحلة Node.js على Coddy. الدرس 3 من 17.

يمكن لأي شخص الآن التسجيل مرتين بالاسم نفسه، أو بكلمة المرور 1. يجب أن يتحقق التسجيل مما يستلمه قبل تخزين أي شيء.

يوضح رمزا الحالة ما الخطأ الذي حدث. يعني 400 طلب غير صالح أن الطلب نفسه غير مقبول، مثل كلمة مرور قصيرة جدًا. ويعني 409 تعارض أن هناك تعارضًا مع بيانات لديك بالفعل، مثل اسم مستخدم محجوز.

تحتاج الأسماء أيضًا إلى طريقة كتابة موحدة. يبدو Ada وada للجميع كشخص واحد عند قراءتهما، لذا حوّل الاسم إلى أحرف صغيرة قبل تخزينه وقبل البحث عنه:

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

التحدي

سهل
  • يُرجع POST /signup الرمز 400 مع { error } عند عدم تقديم اسم مستخدم أو عند استخدام كلمة مرور تقل عن 8 أحرف.
  • يُرجع الرمز 409 مع { error } عند استخدام اسم مستخدم محجوز.
  • تُخزَّن أسماء المستخدمين بأحرف صغيرة، ويقبل POST /login أي حالة للأحرف.

أنشئ حسابًا باسم Ada، ثم باسم ada، ثم سجّل الدخول باسم ADA. جرّب كلمة المرور 1234 أيضًا.

جرّب بنفسك

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

// يعرض ما خزّنه signup. للتعلّم فقط: لا يتضمن تطبيق حقيقي هذا المسار أبدًا.
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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المصادقة والأمان