Menu
CoddyTech

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

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

يمكن لأي شخص الآن التسجيل مرتين بالاسم نفسه، أو باستخدام كلمة المرور 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

التحدي

سهل

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

  1. في server.js، في بداية POST /signup، نظّف اسم المستخدم: أزل المسافات المحيطة به واجعله بأحرف صغيرة، بحيث يصبح " Ada " "ada". إذا لم يُقدَّم اسم مستخدم، فليصبح الاسم فارغًا.
  2. وأنت ما زلت في POST /signup: عندما يكون الاسم فارغًا، أو تكون كلمة المرور أقصر من 8 أحرف، أرسل استجابة بحالة 400 و{"error": "Pick a username and a password of at least 8 characters"}. كلمة المرور التي تتكون من 8 أحرف بالضبط طويلة بما يكفي.
  3. عندما يكون هناك مستخدم بهذا الاسم بعد تنظيفه، أرسل استجابة بحالة 409 و{"error": "That username is taken"}.
  4. وإلا، احفظ المستخدم بالاسم ذي الأحرف الصغيرة. تعرض استجابة 201 الاسم المحفوظ: {"username": "ada"}، حتى عندما يكون الطلب قد أرسل "Ada".
  5. في POST /login، نظّف اسم المستخدم بالطريقة نفسها قبل البحث عنه. عندئذٍ يمكن لـADA تسجيل الدخول إلى الحساب ada.

جرّب ذلك: اضغط «تشغيل».

  • أرسل POST /signup مع {"username": "Ada", "password": "correct horse"}: الحالة 201 و{"username": "ada"}.
  • أرسل POST /signup مع {"username": "ada", "password": "another password"}: الحالة 409 وخطأ "taken".
  • أرسل POST /login مع {"username": "ADA", "password": "correct horse"}: الحالة 200 و{"username": "ada"}.
  • أرسل POST /signup مع {"username": "bob", "password": "1234"}: الحالة 400.
  • أرسل POST /signup مع {"password": "correct horse"} فقط: الحالة 400 أيضًا.

جرّب بنفسك

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اختبر نفسك

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

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

تدرّب بنفسك: Playground لـ Express