דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. קישור בין פניית סוקט לפניית API (socket io).

קישור בין פניית סוקט לפניית API (socket io).

מתוזמן נעוץ נעול הועבר תכנות
12 פוסטים 2 כותבים 321 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • D מנותק
    D מנותק
    davidnead
    כתב ב נערך לאחרונה על ידי
    #1

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

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

    נפשי בשאלתי: מה הדרך האופטימלית לבצע את המשימה הזו? הsocket IO לא מספק איזה מזהה שאפשר להשתמש בו? אפילו IP לא מצאתי שם, למרות שאני מניח שIP זו לא דרך אמינה מספיק.

    dovidD תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      השיב לdavidnead ב נערך לאחרונה על ידי
      #2

      @davidnead אין לי שום מידע על זה, רק מציע לינק
      https://stackoverflow.com/questions/4641053/socket-io-and-session

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      D תגובה 1 תגובה אחרונה
      1
      • D מנותק
        D מנותק
        davidnead
        השיב לdovid ב נערך לאחרונה על ידי davidnead
        #3

        @dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:

        @davidnead אין לי שום מידע על זה, רק מציע לינק
        https://stackoverflow.com/questions/4641053/socket-io-and-session

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

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

        dovidD תגובה 1 תגובה אחרונה
        0
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          השיב לdavidnead ב נערך לאחרונה על ידי dovid
          #4

          @davidnead אמר בקישור בין פניית סוקט לפניית API (socket io).:

          תודה. לא התעמקתי, אך לפי התאריכים והתוכן עושה רושם שזה מיושן מכדי להיות רלוונטי.

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

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          D תגובה 1 תגובה אחרונה
          1
          • D מנותק
            D מנותק
            davidnead
            השיב לdovid ב נערך לאחרונה על ידי
            #5

            @dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:

            @davidnead אמר בקישור בין פניית סוקט לפניית API (socket io).:

            תודה. לא התעמקתי, אך לפי התאריכים והתוכן עושה רושם שזה מיושן מכדי להיות רלוונטי.

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

            צודק, פספסתי את התשובה הזו. בדר"כ אני מקדיש פחות תשומת לב לתשובות התחתונות, בפרט אחרי שעברתי על שאר התוכן בשרשור והוא כ"כ מיושן.
            באמת נראה שזה הפתרון שחיפשתי. מענין, לא ידעתי בכלל שלsocket io יש middlewares.
            תודה

            תגובה 1 תגובה אחרונה
            0
            • D מנותק
              D מנותק
              davidnead
              כתב ב נערך לאחרונה על ידי
              #6

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

              dovidD תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                השיב לdavidnead ב נערך לאחרונה על ידי dovid
                #7

                @davidnead אתה תמוה, יש בלינק שהבאתי לך שלל של תשובות.
                מהתחלה התפלאתי שדחית את מה שיש שמה בגלל היושן, כי כמעט שלא השתנו דברים.
                איך האימות שלך עובד? אתה משתמש בsession.js? passport? או אולי jwt?

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                D תגובה 1 תגובה אחרונה
                0
                • D מנותק
                  D מנותק
                  davidnead
                  השיב לdovid ב נערך לאחרונה על ידי davidnead
                  #8

                  @dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:

                  @davidnead אתה תמוה, יש בלינק שהבאתי לך שלל של תשובות.
                  מהתחלה התפלאתי שדחית את מה שיש שמה בגלל היושן, כי כמעט שלא השתנו דברים.
                  איך האימות שלך עובד? אתה משתמש בsession.js? passport? או אולי jwt?

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

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

                  dovidD תגובה 1 תגובה אחרונה
                  0
                  • dovidD מנותק
                    dovidD מנותק
                    dovid ניהול
                    השיב לdavidnead ב נערך לאחרונה על ידי dovid
                    #9

                    @davidnead אמר בקישור בין פניית סוקט לפניית API (socket io).:

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

                    לא הבנת את כיוון הפתרון. מתי שנוצר סוקט, אתה שומר אותו, נכון? אז בשלב הזה אתה צריך מיפוי בין הזיהוי שלך (במקרה שלך מדובר בJWT) לבין הסוקט, Map כל שהוא כזה:

                    const mapUserToSocket = new Map();
                    
                    io.on('connection', function(socket_client) {
                        mapUserToSocket.set(currentUser, socket_client);
                       //bla bla
                    });
                    

                    אח"כ אתה יכול לעשות mapUserToSocket.get מכל בקשת API למצוא את הסוקט המבוקש.
                    אלא מה? השאלה היא איך מגיעים לcurrentUser ועל זה ורק על זה הבאתי לך את הלינק. אני לא ידעתי שאתה משתמש בjwt אבל הבאתי לך איך מוצאים את פרטי הבקשה מתוך התחברות הסוקט.

                    עריכה אתה אומר שלא רלוונטי איך אתה מאמת כי עוד לא עשית אימות, ובכן בלי אימות אין דרך תיאורטית בעולם לקשר ביניהם, כלומר לא השאלה איזה קוד אלא פשוט גם המחשב לא יכול לדעת בחיים שסוקט מסויים יצא מאותו טאב של בקשה אחרת. אז דבר ראשון תתמקד באימות הסוקט (אולי תשתמש בזה https://www.npmjs.com/package/socketio-jwt).

                    אחת היא קוד מיושן ונסמכת על ספריות מיושנות

                    אין שמה קוד מיושן וספריות מיושנות, יש שמה אולי ספריות שאתה לא משתמש איתם.

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    D תגובה 1 תגובה אחרונה
                    0
                    • D מנותק
                      D מנותק
                      davidnead
                      השיב לdovid ב נערך לאחרונה על ידי
                      #10

                      @dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:

                      אח"כ אתה יכול לעשות mapUserToSocket.get מכל בקשת API למצוא את הסוקט המבוקש.
                      אלא מה? השאלה היא איך מגיעים לcurrentUser ועל זה ורק על זה הבאתי לך את הלינק. אני לא ידעתי שאתה משתמש בjwt אבל הבאתי לך איך מוצאים את פרטי הבקשה מתוך התחברות הסוקט.

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

                      עריכה אתה אומר שלא רלוונטי איך אתה מאמת כי עוד לא עשית אימות, ובכן בלי אימות אין דרך תיאורטית בעולם לקשר ביניהם, כלומר לא השאלה איזה קוד אלא פשוט גם המחשב לא יכול לדעת בחיים שסוקט מסויים יצא מאותו טאב של בקשה אחרת. אז דבר ראשון תתמקד באימות הסוקט (אולי תשתמש בזה https://www.npmjs.com/package/socketio-jwt).

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

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

                      dovidD תגובה 1 תגובה אחרונה
                      0
                      • dovidD מנותק
                        dovidD מנותק
                        dovid ניהול
                        השיב לdavidnead ב נערך לאחרונה על ידי dovid
                        #11

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

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        D תגובה 1 תגובה אחרונה
                        0
                        • D מנותק
                          D מנותק
                          davidnead
                          השיב לdovid ב נערך לאחרונה על ידי
                          #12

                          @dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:

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

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

                          תגובה 1 תגובה אחרונה
                          1

                          בא תתחבר לדף היומי!
                          • התחברות

                          • אין לך חשבון עדיין? הרשמה

                          • התחברו או הירשמו כדי לחפש.
                          • פוסט ראשון
                            פוסט אחרון
                          0
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום