PracticU

הסבר על סשן Session לאימות משתמשים

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › הסבר על סשן Session לאימות משתמשים
מילון מושגים:
זיוף - התחזות ברשת בעזרת זיוף זהות, כמו כתובת מקור או שולח, כדי להטעות מערכת או משתמש.
עוגייה - קובץ קטן שאתר שומר בדפדפן כדי לזכור מידע על המשתמש בין בקשות, למשל מצב התחברות או העדפות.
Middleware - שכבת תוכנה שמתווכת בין רכיבים ומטפלת בבקשות בדרכן, למשל לאימות, רישום לוג או עיבוד נתונים.
POST - שיטת HTTP לשליחת נתונים לשרת כדי ליצור או לעדכן משאב, למשל שליחת טופס.
jQuery - ספריית JavaScript ותיקה שמפשטת את הגישה לרכיבי הדף, אירועים ואנימציות בדפדפן.
AJAX - טכניקה שמאפשרת לדף אינטרנט לשלוח ולקבל נתונים מהשרת ברקע ולעדכן את התצוגה בלי לטעון מחדש.
GET - שיטת HTTP לבקשת מידע מהשרת בלי לשנות אותו. הפרמטרים מועברים בדרך כלל בכתובת.
JWT - אסימון חתום בפורמט JSON שמעביר נתוני זהות והרשאה בין צדדים באופן קומפקט ומאומת.

הסבר על סשן Session לאימות משתמשים
באתר הדגמה ב-Node.js, משתמש שלא עשה לוגין עדיין יכול לראות את המוצרים, כי הבדיקה מתבצעת רק בצד הלקוח. השיעור מראה איך מגינים על ה-routes בצד השרת בעזרת session.
מה הבעיה
1. גישה ישירה ל-API: מי שגולש ישירות ל-api/products מקבל את כל המוצרים גם בלי לוגין, כי השרת עונה לכל פנייה. כל מה שמגיע לצד הלקוח נגיש לכולם.
2. זיוף בצד הלקוח: אפשר ליצור בעצמך אובייקט user ב-F12 (Application) ואז האתר מציג את המוצרים. הלקוח ביצע את הבדיקה ולא השרת.
השלבים העיקריים
1. התקנת session: מתקינים express-session ומגדירים אותו עם server.use: שם לעוגייה, secret להצפנת ה-session ID, resave ו-saveUninitialized בערך false.
2. סימון משתמש מחובר: בקונטרולר האימות, בסוף register מוצלח ובסוף login מוצלח, מגדירים request.session.loggedIn = true רגע לפני החזרת התשובה.
3. בניית middleware: קובץ verify-logged-in.js בודק את ערך הסשן. אם הוא לא קיים (undefined או false) מחזירים סטטוס שגיאה והודעה "you are not logged", ואחרת קוראים ל-next().
4. הפעלה על כל הקונטרולר: ב-products controller משתמשים ב-router.use עם ה-middleware, כך שכל route של המוצרים מוגן. הפורום נשאר פתוח כי כך נקבעה הלוגיקה של האתר.
5. מנגנון logout: מוסיפים route ל-logout בקונטרולר האימות שמריץ request.session.destroy ואז response.end. בלי זה השרת ממשיך להתייחס למשתמש כמחובר גם אחרי יציאה.
6. קריאה מהלקוח: ב-out.js בצד הלקוח, לפני הניתוב לדף הבית, שולחים בקשת POST ב-jQuery Ajax ל-/api/auth/logout. בשגיאה מציגים alert, ורק בהצלחה עוברים לדף הבית.
401 לעומת 403
הקוד 401 (unauthorized) מתאים כשהשרת לא יודע מי המשתמש כי לא התחבר, וזה מה שנבחר כאן. הקוד 403 (forbidden) מתאים כשהמשתמש מזוהה אבל ה-role שלו לא מאפשר לו להיכנס.
שימו לב
- register, login ו-logout הם תמיד בקשות POST, לפי המוסכמה, גם כש-login נראה כמו GET.
- אם ה-middleware כבר החזיר תשובה, אין צורך ב-next.
- בבדיקה: אחרי ההגנה, גם גלישה ל-api/products וגם המשתמש המזויף ב-F12 נחסמים. אחרי login חוקי רואים מוצרים, ואחרי logout שוב נחסמים.
בסוף השיעור אפשר להגן על routes בצד השרת בעזרת session ו-middleware. השיעור הבא מציג שיטה נוספת, JWT.
השיעור הבא בקורס: הסבר על JWT לאימות משתמשים

פרקי ההרצאה: הסבר על סשן Session לאימות משתמשים

  1. 00:00

    חסימת המוצרים למשתמש לא מחובר

  2. 01:01

    גלישה ישירה ל-API של המוצרים

  3. 01:53

    שתילת אובייקט יוזר ב-F12

  4. 02:53

    למה הבדיקה חייבת להיות בשרת

  5. 03:45

    התקנה והגדרה של express-session

  6. 06:02

    סימון לוגין בסשן ברישום ובכניסה

  7. 07:07

    בניית middleware לבדיקת לוגין

  8. 08:45

    החזרת סטטוס 401 או 403

תמלול ההרצאה: הסבר על סשן Session לאימות משתמשים

הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על סשן Session לאימות משתמשים» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:04

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

  2. 00:27

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

  3. 01:01

    אז אותו האקר יכול להגיד, אוקיי, אתה לא נותן לי לראות את המוצרים? אין בעיה, אל תיתן לי לראות את המוצרים. אני גולש לבד ל-api/products.

  4. 01:16

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

  5. 01:42

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

  6. 02:13

    ג'ייסון ואני ראיתי באיזשהו מחשב של קולגה ב-F12 שזה first name בואו נקרא לזה ha ב-last name, בואו נקרא לזה גם ha וזה היוזר שאני כרגע שותל בתוך ה-f12.

  7. 02:36

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

  8. 02:59

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

  9. 03:11

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

  10. 03:26

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

  11. 03:45

    זאתי שיטה אחת, את זה נראה בסרטון הזה. בסרטון הבא נראה שיטה אחרת, שהיא אפילו יותר פופולרית ויותר טובה מהשיטה הזאת, אבל בואו נראה את שתי השיטות.

  12. 03:56

    אנחנו רוצים להגדיר פשן, לכן מה שאנחנו רוצים לעשות זה קודם כל, בואו נעצור, נתקין פשן. אז יש לנו npmi express session go ויש לנו פה התקנה של מה שדרוש עבור תמיכה בפשן בצד של השאר. עבדנו כבר בעבר באחד הסרטונים הקודמים עם פשנים באיזשהו נושא מיוחד לפשן.

  13. 04:23

    מה שאנחנו צריכים לעשות זה לבוא לפה, קודם כל const ובואו ניצור session שווה require וזה יהיה express session. אחרי שיש לנו את האובייקט ה-fashioned אנחנו רוצים, האמת שזה של המערכת אז אני אעלה אותו פה למעלה, אני תמיד מסדר את המערכת קודם ואז את שלנו קודם ואז משתנים של פונקציות כאלה אחר כך.

  14. 04:52

    אנחנו רוצים עכשיו להגדיר, אפילו נעשה את זה פה, server use ולבוא ל-session ולהגיד לו קונפיגורציה בסיסית של fashion שראינו בעבר. והקונפיגורציה אמרה קודם כל מה השם של הקוקי שהולך להישמר עבור ה- fashion הזה, בואו נקרא לזה Northwind fashion, לאחר מכן secret איזושהי מחרובת בשביל להצפין

  15. 05:25

    את אותו fashion ID, נקרא לזה tensRU, ולאחר מכן אנחנו רוצים ריסייב זה יהיה true כמו שעשינו בעבר ולבסוף save uninitialized false שתי הגדרות קונפיגורציה שדיברנו עליהן והנה יש לנו עכשיו תמיכה בפשן האתר תומך כרגע

  16. 05:53

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

  17. 06:12

    אז מיד אחרי שביצענו את כל הפעולות וראינו שהוא עבר בהצלחה ולא קרס או משהו כזה, שנייה לפני שאני מחזיר לו תשובה, אני הולך ל-recurse session ואני מכניס לוגד אין, ממציא משתנה true.

  18. 06:30

    זה אומר מבחינתי שהוא לוגד אין. אנחנו רוצים לבצע את אותו הדבר גם בלוג אין. אם הוא הצליח לבצע לוג-אין בהצלחה אחרי האיף הזה, אותו סיפור request.session.loggedin = true ואז מבחינתי היוזר הוא לוג-דה-אין.

  19. 06:53

    מה עוד אנחנו רוצים? אנחנו עכשיו רוצים להגדיר בעצם middleware. אנחנו צריכים לבנות כאן, קודם כל נבין למה אנחנו צריכים middleware. על מה אנחנו בעצם רוצים להגן?

  20. 07:11

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

  21. 07:32

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

  22. 07:42

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

  23. 08:08

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

  24. 08:25

    לכן בואו נייצר מידלוויר בתוך המידלוויר בואו נכניס verify logged in js יש לנו כאן function verify logged in בואו נברר שאתה לוגד אין בגלל שזה middleware יש לנו request response ו-next וכל מה שאני עושה זה בודק את הסשן אם not request session logged in אוקיי זה בעצם אותו משתנה אפשר לקרוא לו גם is logged in

  25. 09:08

    אבל כרגע קראתי לו logged in, איפה הוא נעלם לי? אם לא קיים לי דבר כזה, או שהוא undefined או שהוא false, לא משנה, לא קיים דבר כזה, אני ניגש ל-response.status ואני שולח סטטוס ויש שני סטטוסים שנהוג לשלוח במצבים של האותנטיקיישן 401 או 403. מה ההבדל?

  26. 09:34

    ארבע מאות ואחת זה unauthorized זה מצב שבו

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: פריצה לאתר דרך כתובת URL

ההרצאה הבאה: הסבר על JWT לאימות משתמשים

הרצאות קשורות מקורסים אחרים

  • Session object - חלק 1
  • משתמשים מקומיים - חלק 1
  • יצירת משתמשים ב-AD
  • חטיפה של HTTP Session

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React