قواعد التسجيل
جزء من قسم المصادقة والأمان في رحلة 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' });
}التحدي
سهليمكن لأي شخص الآن إنشاء حساب مرتين بالاسم نفسه، أو باستخدام كلمة المرور 1. اجعل إنشاء الحساب يتحقق مما يتلقاه قبل حفظ أي شيء.
- في
server.js، في بدايةPOST /signup، نظّف اسم المستخدم: أزل المسافات المحيطة به واجعله بأحرف صغيرة، بحيث يصبح" Ada ""ada". إذا لم يُقدَّم اسم مستخدم، فليصبح الاسم فارغًا. - وأنت ما زلت في
POST /signup: عندما يكون الاسم فارغًا، أو تكون كلمة المرور أقصر من 8 أحرف، أرسل استجابة بحالة 400 و{"error": "Pick a username and a password of at least 8 characters"}. كلمة المرور التي تتكون من 8 أحرف بالضبط طويلة بما يكفي. - عندما يكون هناك مستخدم بهذا الاسم بعد تنظيفه، أرسل استجابة بحالة 409 و
{"error": "That username is taken"}. - وإلا، احفظ المستخدم بالاسم ذي الأحرف الصغيرة. تعرض استجابة 201 الاسم المحفوظ:
{"username": "ada"}، حتى عندما يكون الطلب قد أرسل"Ada". - في
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');
});
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المصادقة والأمان
تدرّب بنفسك: Playground لـ Express