ניהול סשנים עם זהויות חיצוניות

במאמר הזה מוסבר איך לנהל סשנים באמצעות שרת proxy לאימות זהויות (IAP) אם אתם משתמשים בזהויות חיצוניות לאימות.

רענון הסשנים

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

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

טיפול בבקשות שאינן מסוג AJAX

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

טיפול בבקשות AJAX

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

לקבלת הוראות לניהול קובצי Cookie של צד שלישי ב-Chrome, ראו איך מוחקים, מאשרים ומנהלים קובצי Cookie ב-Chrome

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

  • משנים את קוד האפליקציה כדי לטפל בקודי סטטוס HTTP 401.

  • מוסיפים iframe לאפליקציה כדי להפנות לרענון הסשן.

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

אם אתם מקבלים קוד סטטוס 302 במקום 401 בתגובה לבקשות AJAX, הוסיפו כותרת X-Requested-With עם הערך XMLHttpRequest. כך IAP יודע שהבקשה מגיעה מ-JavaScript.

טיפול בשגיאת HTTP 401 באמצעות קוד

הדרך המומלצת לרענן סשן AJAX היא לטפל באופן פרוגרמטי בקודי סטטוס HTTP 401. לשם כך:

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

    if (response.status === 401) {
      statusElm.innerHTML = 'Login stale. <input type="button" value="Refresh" onclick="sessionRefreshClicked();"/>';
    }

  2. מוסיפים handler שפותח חלון לאימות מחדש של המשתמש, וסוגרים אותו כשהתהליך מסתיים.

    var iapSessionRefreshWindow = null;
    
    function sessionRefreshClicked() {
      if (iapSessionRefreshWindow == null) {
        iapSessionRefreshWindow = window.open("/?gcp-iap-mode=DO_SESSION_REFRESH");
        window.setTimeout(checkSessionRefresh, 500);
      }
      return false;
    }
    
    function checkSessionRefresh() {
      if (iapSessionRefreshWindow != null && !iapSessionRefreshWindow.closed) {
        // Attempting to start a new session.
        // XMLHttpRequests is used by the server to identify AJAX requests
        fetch('/favicon.ico', {
              method: "GET",
              credentials: 'include',
              headers: {
                  'X-Requested-With': 'XMLHttpRequest'
              }
        .then((response) => {
          // Checking if browser has a session for the requested app
          if (response.status === 401) {
            // No new session detected. Try to get a session again
            window.setTimeout(checkSessionRefresh, 500);
          } else {
            // Session retrieved.
            iapSessionRefreshWindow.close();
            iapSessionRefreshWindow = null;
          }
        })
        });
      } else {
        iapSessionRefreshWindow = null;
      }
    }

שימוש ב-iframe

אם אתם לא יכולים לטפל ב-HTTP 401 באופן פרוגרמטי, הפתרון הטוב ביותר הבא הוא להוסיף iframe לאפליקציה שמפנה לרענון הסשן.

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

דוגמה לשימוש ב-iframe:

<iframe src="https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER" style="width:0;height:0;border:0; border:none;"></iframe>

המערכת טוענת את מרענן הסשן

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

https://example.com/some/path?gcp-iap-mode=SESSION_REFRESHER

הוצאת משתמשים מהחשבון

כדי להוציא משתמש ממשאב IAP, משתמשים בפרמטר השאילתה ?gcp-iap-mode=GCIP_SIGNOUT. לדוגמה, באפליקציית App Engine, כתובת ה-URL נראית כך:

https://example.com/some/path?gcp-iap-mode=GCIP_SIGNOUT

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

כדי להוציא משתמש מכל המשאבים והסשנים, צריך להפנות אותו לכתובת ה-URL לאימות עם מפתח ה-API ו-mode=signout כפרמטרים מצורפים. לדוגמה:

https://auth.example.com/?apiKey=API-KEY&mode=signout

המשתמשים יישארו בדף אחרי שהיציאה מהחשבון תושלם. כדאי להטמיע את הקריאה החוזרת (callback) של completeSignOut() באובייקט AuthenticationHandler כדי לספק למשתמש משוב על כך שהוא יצא מהחשבון בהצלחה.

מעבר בין דיירים

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

כדי לאלץ את תהליך בחירת הדייר להתחיל מחדש, משתמשים ב-?gcp-iap-mode=CLEAR_LOGIN_COOKIE. לדוגמה, באפליקציית App Engine, כתובת ה-URL יכולה להיראות כך:

https://PROJECT-ID.appspot.com/some/path?gcp-iap-mode=CLEAR_LOGIN_COOKIE

המאמרים הבאים