אימות משתמש הוא תהליך אימות הזהות של משתמש המנסה לקבל גישה לאפליקציה שלך. זה כולל הרשאה והעברת אישורים כדי לאשר את האותנטיות של המשתמש.

אתה יכול ליישם מודל אימות משתמש פשוט ב-Node.js באמצעות Express, Bcrypt ו-MongoDB, בכמה שלבים בלבד.

שלב 1: הגדרת סביבת פיתוח

ראשית, צור תיקיית פרויקט ו CD לתוך זה על ידי הפעלת:

אימות משתמש mkdir
CD אימות משתמש

לאחר מכן, אתחל את npm בספריית הפרויקט שלך על ידי הפעלת:

npm init -y

ה flag מאתחל את npm ויוצר את שלך package.json קובץ עם כל ברירות המחדל שלו.

מודל אימות משתמש זה דורש כמה תלות.

הם כוללים:

  • אֶקְסְפּרֶס: Express היא מסגרת Node.js המספק קבוצה חזקה של תכונות עבור יישומי אינטרנט וניידים. זה מקל על בניית יישומי backend עם Node.js.
  • Bcrypt: bcrypt היא חבילת npm המיישמת את פונקציית הגיבוב סיסמת bcrypt. זה מאפשר לך ליצור Hash ממחרוזות סיסמאות פשוטות.
  • Mongoose: Mongoose היא ספריית מודלים של אובייקטים של MongoDB. זה מפשט את האינטראקציות בין האפליקציה שלך למסד נתונים של MongoDB.
  • dotenv: dotenv היא חבילת אפס תלות שטוענת משתני סביבה מ-a .env קובץ לתוך process.env.
  • Validator: Validator היא חבילה המכילה פונקציות שונות של אימות מחרוזת.
  • instagram viewer
  • Body-parser: חבילת body-parser מנתחת גופי בקשה בתוכנת ביניים לפני המטפלים שלך.

התקן את החבילות על ידי הפעלת:

npm להתקין express bcrypt mongoose dotenv אימות גוּף-מנתח

לאחר מכן, צור app.js קובץ בספריית השורש של הפרויקט שלך והוסף את בלוק הקוד למטה כדי ליצור שרת Express בסיסי:

// app.js
const express = לִדרוֹשׁ('אֶקְסְפּרֶס');
const app = express();
const bodyParser = לִדרוֹשׁ("מנתח גוף");

const יציאה = 3000;

אפליקציה.להשתמש(bodyParser.json());
אפליקציה.להשתמש(bodyParser.urlencoded({ מורחב: נכון }));

app.listen (יציאה, ()=>{
לְנַחֵם.עֵץ(`האפליקציה מאזינה ביציאה ${port}`);
});

קוד זה יוצר מופע יישום אקספרס על ידי קריאה לפונקציה אקספרס. לאחר מכן הוא משתמש ב- מנתח גוף תוכנת ביניים לניתוח גופי בקשות נכנסות. אז הוא מתחיל להאזין לתעבורה ביציאה 3000 על ידי קריאה לשיטת ההאזנה של המופע המפורש והעברת משתנה היציאה כארגומנט.

שלב 2: חיבור האפליקציה שלך למסד נתונים

בספריית השורש של הפרויקט שלך, צור א .env קובץ ואחסן בו את אישורי MongoDB שלך. זה ימנע חשיפת אישורי מסד הנתונים שלך בקוד שעלול לתת למשתמשים זדוניים גישה למסד הנתונים שלך.

לאחר מכן, נווט אל שלך app.js קובץ ויבוא נמיה:

const נמיה = לִדרוֹשׁ("נְמִיָה");

לאחר מכן, התקשר לייבא dotenv ולהתקשר ל תצורה שיטה עליו:

לִדרוֹשׁ("dotenv").config();

מתקשר ל תצורה שיטה על dotenv טוען משתנים סביבתיים לתוך process.env.

לבסוף, הפעל את שיטת החיבור נְמִיָה והעבר את ה-URI של MongoDB כטיעון:

mongoose.connect (process.env. MONGODB_URI).then(() => {
console.log('מחובר למסד נתונים בהצלחה')
})

שלב 3: יצירת מודל משתמש

בספריית השורש של הפרויקט שלך, צור "דגמים” תיקייה; זה המקום שבו תשמור את דגם הנמייה שלך:

דגמי mkdir

לאחר מכן, צור "UserModel" הקובץ והוסף את הייבוא ​​הבא:

const נמיה = לִדרוֹשׁ('נְמִיָה')
const { isEmail } = לִדרוֹשׁ('מאמת')

isEmail היא פונקציית אימות שמחזירה נָכוֹן אם מחרוזת נתונה היא אימייל. תזדקק לו כדי להחיל אימות נמייה על מודל המשתמש שלך.

לאחר מכן, הוסף את הקוד הבא שלך UserModel קוֹבֶץ:

// models/userModel
const userSchema = נמייה. סכֵימָה({
אימייל: {
סוּג: חוּט,
נדרש: [נכון, 'נדרש אימייל'],
לאמת: {
מאמת: isEmail,
הודעה: אביזרים => `${props.value} אינו אימייל חוקי`
}
},

סיסמה: {
סוּג: חוּט,
נדרש: [נכון, 'דרושה סיסמא'],
לאמת: {
מאמת: פוּנקצִיָה (ערך) {
לַחֲזוֹר value.length >= 6
},
הודעה: () =>'הסיסמה חייבת להיות באורך שישה תווים לפחות'
}
}
})

מודול.יצוא = mongoose.model('User', userSchema)

הקוד למעלה יוצר א userSchema משתנה המאחסן את הערך של נְמִיָה. סכֵימָה שיטה. הנמייה. שיטת Schema ממפה מאפיינים לאוסף MongoDB ומגדירה את צורת המסמכים בתוכו. לסכימת הנמייה שני מאפיינים - an אימייל וכן א סיסמה- שיהיו דרישות האימות שלך.

מאפיין האימייל הוא מסוג מחרוזת ויש לו נדרש מוגדר כאמת. הודעת השגיאה הנלווית, "נדרשת דוא"ל, תוצג אם גוף הבקשה אינו מכיל אימייל תכונה. לבסוף, באמצעות אימות מותאם אישית של נמייה, ה מאמת רכוש מתייחס ל isEmail פוּנקצִיָה. פונקציה זו מחזירה true או false בהתבסס על תוקף המחרוזת כמייל. ואז מאפיין ההודעה לוקח את ערך האימייל (אביזרים) ובונה הודעת שגיאה משמעותית.

מאפיין הסיסמה הוא סוג מחרוזת נדרש עם הודעת שגיאה שקוראת "נדרשת סיסמה". ה מאמת הפונקציה היא אנונימית שמחזירה true אם הסיסמה היא באורך שישה תווים לפחות.

השורה האחרונה יוצרת ומייצאת מודל נמייה על ידי קריאה ל- דֶגֶם שיטה על נְמִיָה. תעביר את שם הדגם (מִשׁתַמֵשׁ) כארגומנט הראשון וסכימה (userSchema) כטיעון השני.

שלב 4: יישום מסלולי כניסה והרשמה

בספריית השורש של הפרויקט שלך, צור א מסלולים תיקייה:

מסלולי mkdir

בתיקיית המסלולים שלך, צור א userRoutes.js קובץ והוסף את הייבוא ​​הבא:

// routes/userRoutes.js
const express = לִדרוֹשׁ("אֶקְסְפּרֶס");
const משתמש = לִדרוֹשׁ("../models/userModel");
const bcrypt = לִדרוֹשׁ("bcrypt");

צור מופע של נתב אקספרס על ידי קריאה ל- נתב שיטה על אֶקְסְפּרֶס:

const נתב = אקספרס. נתב();

לאחר מכן, צור את מסלול ההרשמה שלך על ידי הוספת בלוק הקוד למטה userRoute.js קוֹבֶץ:

router.post("/sign-up", אסינכרון (req, res) => {
לְנַסוֹת {
// חלץ אימייל וסיסמה מהאובייקט req.body
const { email, password } = req.body;

// חשבוןאם המייל הוא כְּבָר בלהשתמש
תן userExists = לְהַמתִין User.findOne({ email });

if (userExists) {
res.status(401).json({ הודעה: "האימייל כבר נמצא להשתמש." });
לַחֲזוֹר;
}

// הגדירו סבבי מלח
const saltRounds = 10;

// סיסמת Hash
bcrypt.hash (סיסמה, saltRounds, (טעה, hash) => {
אם (לִטְעוֹת) לזרוקחָדָשׁשְׁגִיאָה("שרת פנימי שְׁגִיאָה");

// לִיצוֹר א חָדָשׁמִשׁתַמֵשׁ
תן משתמש = חָדָשׁ מִשׁתַמֵשׁ({
אימייל,
סיסמה: בְּלִיל,
});

// שמור את המשתמש במסד הנתונים
user.save().then(() => {
res.json({ הודעה: "המשתמש נוצר בהצלחה", משתמש });
});
});
} לתפוס (שגיאה) {
לַחֲזוֹרמילואים.סטָטוּס(401).לִשְׁלוֹחַ(לִטְעוֹת.הוֹדָעָה);
}
});

בבלוק הקוד שלמעלה, ראשית, ביטלת את מבנה האימייל והסיסמה מה- Req.body לְהִתְנַגֵד. לאחר מכן, בדוק אם משתמש כבר משתמש בדוא"ל מכיוון שהוא צריך להיות ייחודי עבור כל משתמש. אם כבר נעשה שימוש באימייל, אתה חוזר ומפסיק את ביצוע הקוד עם קוד סטטוס 401.

אחסון סיסמאות פשוטות במסד נתונים הוא איום אבטחה עצום מכיוון שהאקרים זדוניים עלולים לקבל גישה למסד הנתונים. אתה צריך גיבוב סיסמאות לפני הוספתן במסד הנתונים שלך, כך שגם אם האקר מגלה אותן, לא אמור להיות סיכון למשתמשים. Hashing הוא תהליך המרת "מפתח" נתון לערך אחר. Hashing היא פונקציה חד-כיוונית, מה שאומר שלא ניתן לאחזר את הערך המקורי מה-Hash, בניגוד להצפנה.

באמצעות bcrypt, גיבשת סיסמת המשתמש שלך על ידי קריאה לשיטת ה-hash ב-bcrypt. שיטת הגיבוב לוקחת שלושה פרמטרים: המחרוזת שיש לגיבוב, סיבובי מלח ופונקציית התקשרות חוזרת. אתה מעביר את סיסמת המשתמש, את המשתנה saltRounds שיצרת קודם, והתקשרות חוזרת.

סבבי מלח מתייחסים לזמן הדרוש לחישוב hash של bcrypt בודד. ככל שסיבובי המלח גבוהים יותר, כך סיבובי הגיבוב גבוהים יותר.

אם שיטת ה-hash זורקת שגיאה, אתה זורק "שגיאת שרת פנימית". אחרת, אתה מגדיר את מאפיין הסיסמה ל-hash המוצלח ושומר אותו במסד הנתונים שלך על ידי קריאה לשיטת השמירה ב- מִשׁתַמֵשׁ למשל.

לאחר מכן, צור את נתיב הכניסה שלך על-ידי הוספת בלוק הקוד למטה userRoute.js קוֹבֶץ:

router.post("/sign-in", אסינכרון (req, res) => {
לְנַסוֹת {
// חלץ אימייל וסיסמה מהאובייקט req.body
const { email, password } = req.body;

// חשבוןאםמִשׁתַמֵשׁקייםבמאגר מידע
תן משתמש = לְהַמתִין User.findOne({ email });

if (!user) {
return res.status (401).json({ הודעה: "אישורים לא חוקיים" });
}

// השווה סיסמאות
bcrypt.compare (סיסמה, user.password, (שגיאה, תוצאה) => {
אם (תוצאה) {
return res.status (200).json({ הודעה: "המשתמש התחבר בהצלחה" });
}

לְנַחֵם.log (שגיאה);
return res.status (401).json({ הודעה: "אישורים לא חוקיים" });
});
} לתפוס (שגיאה) {
מילואים.סטָטוּס(401).לִשְׁלוֹחַ(לִטְעוֹת.הוֹדָעָה);
}
});

מודול.יצוא = נתב;

בבלוק הקוד שלמעלה, ראשית, אתה מבטל את מבנה האימייל והסיסמה מה- Req.body לְהִתְנַגֵד. לאחר מכן, אתה בודק אם קיים משתמש במסד הנתונים שלך. אם המשתמש לא קיים במסד הנתונים שלך, אתה חוזר עם קוד סטטוס 401.

לאחר מכן, באמצעות שיטת ההשוואה של bcrypt, העבירו את הסיסמה שהמשתמש סיפק ואת הסיסמה המגובבת ששלפתם ממסד הנתונים שלכם. השווה בין השניים כדי לוודא אם הם תואמים. אם הסיסמאות תואמות, אתה מחזיר קוד סטטוס 200 והודעת הצלחה. אחרת אתה מחזיר קוד סטטוס 401 והודעת שגיאה.

לבסוף, ייבוא נתב לתוך שלך app.js קובץ והשתמש בו בתור תוכנת ביניים ברמת היישום.

זה משלים את מודל אימות המשתמש שלך; כעת, משתמשים יכולים להירשם בצורה מאובטחת ולהיכנס לאפליקציה שלך.

החשיבות של אימות משתמש

אימות משתמשים מבטיח שרק משתמשים לגיטימיים יכולים לקבל גישה לאפליקציה שלך. אם הנתונים שלך הם אישיים או פרטיים בדרך כלשהי, עליך לנקוט בצעדים כדי למנוע ממשתמשים לא מאומתים לקבל גישה.