עדכונים של FedCM: API לסטטוס התחברות, Error API וממשק API לסימון שנבחר באופן אוטומטי

ב-Chrome 120 מופיע Login Status API ל-FedCM. Login Status API (לשעבר IdP Sign-in Status API) מאפשר לאתרים, במיוחד לספקי זהויות, לאותת לדפדפן מתי המשתמשים נכנסים לחשבון ומתי הם יוצאים ממנו. המערכת של FedCM משתמשת באות הזה כדי לטפל בבעיה של התקפת תזמון שקטה, וכך מאפשרת ל-FedCM לפעול ללא קובצי cookie של צד שלישי לגמרי. העדכון הזה מתייחס לשינויים האחרונים שאינם תואמים לאחור שזיהינו בהודעה המקורית בנושא כוונה לשלוח את FedCM, כחלק מהיקף העבודה שלנו.

ה-Login Status API משפר את מאפיין הפרטיות ואת נוחות השימוש, אבל הוא שינוי שלא תואם לאחור אחרי השקה. אם כבר הטמעתם את FedCM, חשוב לעדכן אותו לפי ההוראות הבאות.

בנוסף, ב-Chrome יש שתי תכונות חדשות של ניהול פרטי כניסה מאוחדים (FedCM):

  • Error API: שליחת התראה למשתמשים כשניסיון הכניסה שלהם נכשל באמצעות ממשק משתמש מקורי, על סמך התשובה מהשרת מנקודת הקצה של טענת הנכוֹנוּת (assertion) של המזהה, אם יש כזו.
  • Auto-Selected Flag API: שליחת הודעה לספק הזהויות (IdP) ולצד הנסמך (RP) אם פרטי הכניסה נבחרו באופן אוטומטי בתהליך.

Login Status API

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

עדכון הדפדפן לגבי סטטוס הכניסה של המשתמש

ספקי IdP יכולים להעביר לדפדפן אות לגבי סטטוס הכניסה של המשתמש על ידי שליחת כותרת HTTP או על ידי קריאה ל-JavaScript API כשהמשתמש מחובר ל-IdP או כשהמשתמש יוצא מכל חשבונות ה-IdP שלו. לכל IdP (שזוהה לפי כתובת ה-URL של ההגדרות שלו), הדפדפן שומר משתנה בן שלוש ערכים שמייצג את מצב הכניסה, עם הערכים האפשריים logged-in,‏ logged-out ו-unknown. מצב ברירת המחדל הוא unknown.

כדי לסמן שהמשתמש מחובר, שולחים כותרת HTTP‏ Set-Login: logged-in בבקשת ניווט ברמה העליונה או בבקשה למשאב משנה מאותו מקור:

Set-Login: logged-in

לחלופין, אפשר לבצע קריאה ל-JavaScript API‏ navigator.login.setStatus('logged-in') ממקור ה-IdP:

navigator.login.setStatus('logged-in');

בקריאות האלה, סטטוס ההתחברות של המשתמש מתועד כ-logged-in. כשסטטוס ההתחברות של המשתמש מוגדר ל-logged-in, ה-RP שמפעיל את FedCM שולח בקשות לנקודת הקצה של רשימת החשבונות של ה-IdP ומציג את החשבונות הזמינים למשתמש בתיבת הדו-שיח של FedCM.

כדי לסמן שהמשתמש התנתק מכל החשבונות שלו, שולחים את כותרת ה-HTTP‏ Set-Login: logged-out בתפריט הניווט ברמה העליונה או בבקשה של משאב משנה מאותו מקור:

Set-Login: logged-out

לחלופין, אפשר לקרוא ל-JavaScript API navigator.login.setStatus('logged-out') מהמקור של ה-IdP:

navigator.login.setStatus('logged-out');

בקריאות האלה, סטטוס ההתחברות של המשתמש מתועד כ-logged-out. כשסטטוס ההתחברות של המשתמש הוא logged-out, הקריאה ל-FedCM נכשלת בשקט בלי לשלוח בקשה לנקודת הקצה של רשימת החשבונות של ה-IdP.

הסטטוס unknown מוגדר לפני שה-IdP שולח אות באמצעות Login Status API. הוספנו את הסטטוס הזה כדי לשפר את המעבר, כי יכול להיות שמשתמש כבר נכנס ל-IdP כשאנחנו שולחים את ה-API הזה. יכול להיות של-IdP לא תהיה הזדמנות לסמן זאת לדפדפן עד להפעלה הראשונה של FedCM. במקרה כזה, אנחנו שולחים בקשה לנקודת הקצה של רשימת החשבונות של ה-IdP ומעדכנים את הסטטוס על סמך התגובה מנקודת הקצה של רשימת החשבונות:

  • אם נקודת הקצה מחזירה רשימה של חשבונות פעילים, מעדכנים את הסטטוס ל-logged-in ופותחים את תיבת הדו-שיח של FedCM כדי להציג את החשבונות האלה.
  • אם נקודת הקצה לא מחזירה חשבונות, מעדכנים את הסטטוס ל-logged-out ומכשילים את הקריאה ל-FedCM.

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

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

בתיבת הדו-שיח של FedCM מוצגת הודעה עם הצעה להיכנס לחשבון, כפי שמוצג בתמונה הבאה.

תיבת דו-שיח של FedCM עם הצעה להיכנס ל-IdP.
תיבת דו-שיח של FedCM עם הצעה להיכנס ל-IdP.

כשהמשתמש לוחץ על הלחצן המשך, נפתחת בדפדפן תיבת דו-שיח לדף ההתחברות של ה-IdP.

תיבת דו-שיח לדוגמה.
תיבת דו-שיח לדוגמה שמוצגת אחרי שלוחצים על הלחצן 'כניסה' ב-IdP.

כתובת ה-URL של דף ההתחברות מצוינה ב-login_url כחלק מקובץ התצורה של ה-IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

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

  • שולחים את הכותרת Set-Login: logged-in או קוראים ל-API‏ navigator.login.setStatus("logged-in") כדי להודיע לדפדפן שהמשתמש נכנס לחשבון.
  • מקישים על IdentityProvider.close() כדי לסגור את תיבת הדו-שיח.
משתמש נכנס לחשבון ב-RP אחרי שהוא נכנס לחשבון ב-IdP באמצעות FedCM.
משתמש נכנס ל-RP אחרי שהוא נכנס ל-IdP באמצעות FedCM.

אתם יכולים לנסות את ההתנהגות של Login Status API בדמו שלנו.

  1. מקישים על הלחצן כניסה לאימות הזהויות.
  2. נכנסים לחשבון שרירותי.
  3. בתפריט הנפתח סטטוס חשבון, בוחרים באפשרות פג תוקף הסשן.
  4. לוחצים על הלחצן עדכון פרטים אישיים.
  5. מקישים על הלחצן כניסה לדף ה-RP לניסיון FedCM.

אתם אמורים לראות את ההתחברות ל-IdP דרך התנהגות המודול.

Error API

כש-Chrome שולח בקשה לנקודת הקצה של טענת הנכוֹנוּת של הזהות (למשל, כשמשתמש לוחץ על הלחצן Continue as בממשק המשתמש של FedCM או כשמתבצעת אימות מחדש אוטומטי), יכול להיות ש-IdP לא יוכל להנפיק אסימון מסיבות לגיטימיות. לדוגמה, אם הלקוח לא מורשה, השרת לא זמין באופן זמני וכו'. נכון לעכשיו, Chrome נכשל בבקשה בשקט במקרה של שגיאות כאלה, ומעדכן את RP רק על ידי דחיית ההבטחה.

באמצעות Error API, Chrome מתריע למשתמש על ידי הצגת ממשק משתמש מקורי עם פרטי השגיאה שסופקו על ידי ה-IdP.

תיבת דו-שיח של FedCM שמציגה את הודעת השגיאה אחרי שניסיון הכניסה של המשתמש נכשל. המחרוזת משויכת לסוג השגיאה.
תיבת דו-שיח של FedCM שמציגה את הודעת השגיאה אחרי שניסיון ההתחברות של המשתמש נכשל. המחרוזת משויכת לסוג השגיאה.

IdP HTTP API

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

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

לקוד, ה-IdP יכול לבחור באחת מהשגיאות המוכרות מרשימת השגיאות שצוינה ב-OAuth 2.0‏ [invalid_request, unauthorized_client, access_denied, server_error ו-temporarily_unavailable] או להשתמש בכל מחרוזת שרירותית. אם זה המצב, Chrome ירנדר את ממשק המשתמש של השגיאה עם הודעת שגיאה כללית ויעביר את הקוד ל-RP.

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

try {
  const cred = await navigator.credentials.get({
    identity: {
      providers: [
        {
          configURL: 'https://idp.example/manifest.json',
          clientId: '1234',
        },
      ],
    }
  });
} catch (e) {
  const code = e.code;
  const url = e.url;
}

Auto-Selected Flag API

mediation: optional הוא התנהגות ברירת המחדל של בחירת המשתמש ב-Credential Management API, והוא מפעיל אימות מחדש אוטומטי כשהדבר אפשרי. עם זאת, יכול להיות שהאימות האוטומטי מחדש לא יהיה זמין מסיבות שידועות רק לדפדפן. במקרה כזה, יכול להיות שהמשתמש יתבקש להיכנס באמצעות תהליך בחירת צד (Mediation) מפורש של משתמש, שהוא תהליך עם מאפיינים שונים.

  • מנקודת המבט של מבצע הקריאה ל-API, כשמקבלים אסימון מזהה, אין לו אפשרות לדעת אם הוא תוצאה של תהליך אימות חוזר אוטומטי. לכן קשה להם להעריך את ביצועי ה-API ולשפר את חוויית המשתמש בהתאם.
  • גם מבחינת ה-IdP, אי אפשר לדעת אם בוצעה אימות מחדש אוטומטי לצורך הערכת הביצועים. בנוסף, הנתונים האלה יכולים לעזור להם לתמוך בתכונות נוספות שקשורות לאבטחה, אם הייתה התערבות מפורשת של משתמש. לדוגמה, יכול להיות שחלק מהמשתמשים יעדיפו רמת אבטחה גבוהה יותר שמחייבת מעורבות מפורשת של המשתמש באימות. אם ה-IdP יקבל בקשה לאסימון ללא תהליך בחירת הרשת, הוא עשוי לטפל בבקשה באופן שונה. לדוגמה, אפשר להחזיר קוד שגיאה כדי שה-RP יוכל להפעיל שוב את FedCM API עם mediation: required.

לכן, חשיפה של תהליך האימות האוטומטי מחדש תהיה מועילה למפתחים.

באמצעות Auto-selected Flag API, Chrome משתף עם ה-IdP ועם ה-RP אם הושגה הרשאת משתמש מפורשת על ידי הקשה על הלחצן Continue as, בכל פעם שהתרחשה אימות מחדש אוטומטי או תהליך בחירת רשת מפורש. השיתוף מתבצע רק אחרי שהמשתמש נותן הרשאה לתקשורת של IdP/RP.

שיתוף IdP

כדי לשתף את המידע עם ה-IdP לאחר קבלת הרשאה מהמשתמש, Chrome כולל את is_auto_selected=true בבקשה POST שנשלחת אל id_assertion_endpoint:

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

שיתוף של גורם מוגבל

הדפדפן יכול לשתף את המידע עם ה-RP ב-isAutoSelected דרך IdentityCredential:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

שיתוף משוב ויצירת אינטראקציה

אם יש לכם משוב או אם נתקלת בבעיות במהלך הבדיקה, אפשר לשתף אותם ב-crbug.com.

תמונה של Girl with red hat ב-Unsplash