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

// מציג מה נשמר בתהליך ההרשמה. לצורכי לימוד בלבד: באפליקציה אמיתית לעולם לא קיים נתיב כזה.
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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה אימות ואבטחה

תרגלו בעצמכם: Express אונליין