אימות משתמשים וממשק ניהול בנוד
-
@dovid
ראשית תודה רבה על התגובה המפורטת והארוכה.!@dovid אמר באימות משתמשים וממשק ניהול בנוד:
express-session.
אם אני מבין נכון (כך היה נדמה לי בניסוי מלמעלה), בכל הפעלה מחדש של השרת/אפליקציה זה מתאפס.
אני צודק?
ולכן זה בעייתי בשבילי, ובעיקר בתקופת הבניה, בו אני מאתחל די הרבה את האפליקציה לאחר כל שינוי. -
@dovid אמר באימות משתמשים וממשק ניהול בנוד:
יש בעיה שלקוח "ינחש" שסנים אחרים
אם אני מבין הספריה של express-session היא ס"ה להקל על הניהול של העוגיות, אבל בסופו של דבר בקטע האבטחה של ה"לנחש" עדיין אנו באותו מקום שהוא יוכל לזייף את העוגיה של express-session ואז הוא שוב מקבל הרשאת גישה.
או שיש כאן מנגנון הצפנה טוב יותר?עריכה:
אני מבין שיש כן קצת יותר אבטחה, שהמשתמש לא יכול לדעת איזה נתונים אתה שומר עליו, כי אתה מאחסן את המידע בשרת, וא"כ למשל אם אתה רוצה לשמור שהוא מחובר למספר מוסד XXX הוא לא יידע זאת.
אוקיי
אבל לעצם האבטחה שמישהו יקבל גישה לא מורשית לשרת באמצעות זיוף עוגיה, על זה נראה לי שאני עומד באותו מקום כמו בעוגיה רגילה.
תקן אותי אם אני טועה -
@yossiz אמר באימות משתמשים וממשק ניהול בנוד:
@חוקר יש הצפנה, express-session מקבלת כפרמטר secret שהוא מפתח ההצפנה:
בשורה אחרונה:
אם אני משתמש בעוגיות בלבד: חסרונות עלי ליצור טוקן מוצפן קשה לזיוף, עלי לנהל את הגדרות העוגיות, המידע (כל העדפות וכו' שאני שומר עליו) חשוף אצלי הלקוח.
אם אני משתמש ב express-session, זה מצפין עבורי מראש את העוגיה. (האם עלי ליצור טוקן, או שמספיק לי מזהה הפעלה פנימי שמשייך לי אותו למשתמש הנכון?), הגדרות הניהול הן יותר קלות, שאר המידע אינו נגיש ללקוח.
ישנו נתון נוסף? כתבתי יבש מידי כנראה.. -
@חוקר לא הבנתי אותך לגמרי.
א. מבחינתי אין שאלה בכלל האם להשתמש ב-node-session. ברור שכדאי להשתמש. לא רואה צד אחר.
ב.האם עלי ליצור טוקן, או שמספיק לי מזהה הפעלה פנימי שמשייך לי אותו למשתמש הנכון?
לא הבנתי את השאלה. node-session עושה עוגייה אחת אצל הלקוח, זה ה-sid (כלומר session id). ה-sid עצמו גם מוצפן. (למה? אני לא יודע, הרי אי אפשר לנחש sid של משתמש אחר, אולי כי ה-sid קצר אז אפשר לעשות מתקפת brute force). כל שאר ה-state שמשוייך לסשן נמצא ב-DB ו-node-session מצמיד אותו אוטומטי לאובייקט שאתה מקבל ב-
req.session
.
כל שעליך לעשות הוא, אחרי שאתה מקבל ומאמת פרטי כניסה, אתה מוסיף לאובייקט הסשן:
req.session.useId = xxx
ואז בכל בקשה שחייב אימות אתה כותב משהו בסגנון של:const isAuthenticated = (req, res, next) => { if (req.session.userId) { return next(); } return res.redirect('/login'); } app.get('/profile', isAuthenticated, (req, res) => { // אתה מגיע לפה רק אם אתה מאומת })
עבור logout אתה פשוט כותב:
req.session.userId = null;
כתבתי בקיצור, אם משהו לא מובן תשאל
אגב, לא העתקתי מקוד שאני משתמש בה, כי אני משתמש בספריית passport, אני לא יודע למה באמת והאם יש יתרון בו באימות פשוט של שם משתמש וסיסמה, אבל הוא תומך בעוד המון סוגי אימות.
-
@חוקר אמר באימות משתמשים וממשק ניהול בנוד:
אם אני מבין הספריה של express-session היא ס"ה להקל על הניהול של העוגיות,
לגמרי!
אבל בסופו של דבר בקטע האבטחה של ה"לנחש" עדיין אנו באותו מקום שהוא יוכל לזייף את העוגיה של express-session ואז הוא שוב מקבל הרשאת גישה.
בהחלט. ניחוש הוא גם דרך בטוחה לזכות בפייס... אתה קראת מה שכתבתי עם ה"קל לניחוש" מול ה"קשקוש"?
אבל לעצם האבטחה שמישהו יקבל גישה לא מורשית לשרת באמצעות זיוף עוגיה, על זה נראה לי שאני עומד באותו מקום כמו בעוגיה רגילה.
אני אכן דיברתי על עוגיה רגילה. עוגיה רגילה זה מאובטח ומצויין...
@חוקר אמר באימות משתמשים וממשק ניהול בנוד:
בשורה אחרונה:
אם אני משתמש בעוגיות בלבד: חסרונות עלי ליצור טוקן מוצפן קשה לזיוף, עלי לנהל את הגדרות העוגיות, המידע (כל העדפות וכו' שאני שומר עליו) חשוף אצלי הלקוח.ממש לא. גם אם אתה מממש לבד הכל בטוח וטוב (אם אתה עושה עם UUID כפי שאמרת בשאלה הפותחת + טבלה בצד שרת שמחזיקה UUID מול מזהה לקוח שלך - אחרי שהוא אימת את עצמו בשם וסיסמה). אתה מפסיד רק שאתה עובד קשה ופה ושם עושה פשלות ויש לך יותר קוד לתחזק.
אם אני משתמש ב express-session, זה מצפין עבורי מראש את העוגיה. (האם עלי ליצור טוקן, או שמספיק לי מזהה הפעלה פנימי שמשייך לי אותו למשתמש הנכון?),
יש פה אי הבנה. אני מקוה שמה ש@yossiz אמר הסביר לך מספיק, הספריה הזאת לא מתעסקת עם כלום. היא סה"כ דואגת שהאובייקט session שבrequest יישאר זהה לכל הבקשות מאותו משתמש בפרק זמן מוגדר. זהו.
את הכניסה בשם וסיסמה ואת "זכירת" איזה משתמש והעדפות צריך לעשות איך שבא לך ולשמור את ה"עולה לדינא" באובייקט session, ובו לבדוק לפי הפעולה מה צריך.
אני עייף אז אולי לא תבין אותי. -
@dovid אמר באימות משתמשים וממשק ניהול בנוד:
את הכניסה בשם וסיסמה ואת "זכירת" איזה משתמש והעדפות צריך לעשות איך שבא לך ולשמור את ה"עולה לדינא" באובייקט session, ובו לבדוק לפי הפעולה מה צריך.
את השמירה של העוגייה בצד לקוח, גם צריך לעשות,
או שזה כן נהיה לבד, וכל מה שצריך לעשות זה רק בשביל לדעת איך לנווט את המשתמש אחרי שזוהה?נ.ב. כמובן חוץ ממה שאמר @yossiz, שכשמקבלים session ריק - בלי user_Id אז צריך להכניס לו user_Id לפי השם משתמש והסיסמא - אם הם נכונים כמובן.
-
בעצם ה exspress-session הוא רק למשתמש יחיד?
כלומר אם שני אנשים עובדים מאותו מחשב, כל פעם שיחליפו, יצטרכו להכניס שם משתמש וסיסמא?
למשל אני עשיתי לבד כזה דבר,
כך נראית רשימת החיבורים, כמובן אם אופציה לניתוק החיבור בנפרד או מחיקת השם משתמש.
כך זה נשמר בדפדפן,
השאלה אם אני יוכל לעשות את אותו רעיון גם בספרייה הנ"ל.
-
@avi-rz ניכר משאלותיך שאתה מסתדר לא רע, אבל חסר לך ידע משלים בהבנת ארכיטקטורת הHTTP.
אני יותר מאשמח אם תפתח נושא ייעודי לזה, ושם אנסה לתת מדריך זוטא בעניין.
כדאי שתסביר בדיוק מה עשית, כדי שעצותיי יהיו טובות יותר מתוך הבנה טובה יותר איפה אתה נמצא.