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