עדכוני FedCM: ניתוק ה-API ושני עדכונים

ב-Chrome 122, אפשר להשתמש ב-ניתוק API עבור Federated Credential Management API (FedCM). ה-ניתוק API מאפשר לגורמים מסתמכים לנתק את המשתמשים שלהם מהחשבון של ספק הזהויות בלי להסתמך על קובצי cookie של צד שלישי. בנוסף, יש כמה עדכונים בטיפול של FedCM באותו אתר.

ניתוק ה-API

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

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

האפשרות ניתוק API מאפשרת למשתמש לנתק את חשבון ה-IdP מה-RP בדפדפן וגם בשרת ה-IdP, על ידי אות שלו לנקודת הקצה שצוינה. המשתמש צריך לעבור את איחוד שירותי אימות הזהות באמצעות Federated Credential Management API (FedCM). לאחר ניתוק המשתמש, הוא נחשב כמשתמש חדש בפעם הבאה שהוא ינסה להיכנס ל-RP באמצעות ה-IdP.

ניתוק ה-IdP מה-RP

אם משתמש נכנס בעבר ל-RP באמצעות ה-IdP דרך FedCM, הקשר יישמר בעל-פה באופן מקומי בדפדפן כרשימת החשבונות המקושרים. הגורם המוגבל יכול ליזום ניתוק על ידי הפעלת הפונקציה IdentityCredential.disconnect(). אפשר לקרוא לפונקציה הזו ממסגרת של גורם מוגבל (RP) ברמה העליונה. ה-RP צריך להעביר configURL, clientId שנעשה בו שימוש ב-IdP ו-accountHint כדי שה-IdP ינותק. רמז לחשבון יכול להיות מחרוזת שרירותית כל עוד נקודת הקצה לניתוק יכולה לזהות את החשבון, לדוגמה, כתובת אימייל או מזהה משתמש שלא תואמים בהכרח למספר החשבון שסופק על ידי נקודת הקצה של רשימת החשבונות:

// Disconnect an IdP account "account456" from the RP "https://idp.com/". This is invoked on the RP domain.
IdentityCredential.disconnect({
  configURL: "https://idp.com/config.json",
  clientId: "rp123",
  accountHint: "account456"
});

הפונקציה IdentityCredential.disconnect() מחזירה Promise. ההבטחה הזו עשויה לגרום לחריגה מהסיבות הבאות:

  • המשתמש לא נכנס ל-RP באמצעות ה-IdP דרך FedCM.
  • ה-API מופעל מתוך iframe ללא מדיניות ההרשאות של FedCM.
  • ה-configURL לא חוקי או חסרה נקודת הקצה לניתוק.
  • הבדיקה של Content Security Policy (CSP) נכשלה.
  • יש בקשת ניתוק בהמתנה.
  • המשתמש השבית את FedCM בהגדרות הדפדפן.

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

הגדרת קובץ תצורה של IdP

כדי לתמוך בניתוק API, ה-IdP צריך לתמוך בנקודת קצה לניתוק, ולספק את המאפיין disconnect_endpoint ואת הנתיב שלו בקובץ התצורה של IdP.

{
  "accounts_endpoint": "/accounts",
  "id_assertion_endpoint": "/assertion",
  ...
  "disconnect_endpoint: "/disconnect"
}

ניתוק החשבון בנקודת הקצה הניתוק

הפעלה של IdentityCredential.disconnect() תגרום לכך שהדפדפן ישלח בקשת POST ממקורות שונים עם קובצי cookie וסוג תוכן של application/x-www-form-urlencoded לנקודת הקצה הניתוק הזו, עם הפרטים הבאים:

מאפיין (property) תיאור
account_hint רמז לחשבון ה-IdP.
client_id מזהה הלקוח של הגורם המוגבל.
POST /disconnect HTTP/1.1
Host: idp.example
Origin: rp.example
Content-Type: application/x-www-form-urlencoded
Cookie: 0x123
Sec-Fetch-Dest: webidentity

account_hint=account456&client_id=rp123

לאחר קבלת הבקשה, שרת ה-IdP צריך:

  1. עונים לבקשה באמצעות CORS (שיתוף משאבים בין מקורות).
  2. צריך לוודא שהבקשה מכילה כותרת HTTP מסוג Sec-Fetch-Dest: webidentity.
  3. מתאימים בין הכותרת Origin לבין מקור ה-RP שנקבע על ידי client_id. אנחנו דוחים אם הם לא תואמים.
  4. מוצאים את החשבון שתואם לaccount_hint.
  5. מנתקים את חשבון המשתמש מרשימת החשבונות המחוברים של הגורם המוגבל.
  6. הגב לדפדפן עם ה-account_id של המשתמש שזוהה בפורמט JSON.

דוגמה למטען ייעודי (payload) של תגובה ב-JSON נראה כך:

{
  "account_id": "account456"
}

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

המערכת מדלגת על הבדיקה /.well-known/web-identity כשה-RP וה-IdP הם באותו האתר

במהלך הפיתוח של מערכת FedCM, ייתכן שתת-דומיינים של שרת ה-IdP שעושים בדיקה או Staging של דומיינים של שרת RP. לדוגמה, שרת ה-IdP של סביבת הייצור נמצא ב-idp.example, וגם שרת ה-RP של ה-Staging ושרת ה-IdP הזמני נמצאים ב-staging.idp.example. עם זאת, מכיוון שהקובץ המוכר חייב להיות ממוקם בשורש eTLD+1 של שרת ה-IdP, הוא צריך להיות ב-idp.example/.well-known/web-identity וזה שרת הייצור. מאחר שמפתחים לא בהכרח יכולים להציב קבצים בסביבת הייצור בזמן הפיתוח, הם לא יכולים לבדוק את FedCM.

החל מגרסה 122 של Chrome, אם דומיין RP ודומיין ה-IdP זהים, Chrome מדלג על בדיקת הקובץ המוכר. כך המפתחים יוכלו לבדוק בתרחיש כזה.

במשאבי המשנה יכולים עכשיו להגדיר סטטוס התחברות באותו אתר

בעבר, Chrome אפשר להגדיר את סטטוס ההתחברות (לדוגמה, באמצעות הכותרת Set-Login: logged-in) רק כאשר הבקשה היא אותו מקור עם כל ישויות האב. הפעולה הזו מנעה כניסות דרך אותו אתר fetch() בקשות להגדרה של סטטוס ההתחברות.

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

בעקבות השינוי הזה, ריככנו את הדרישה ש-Login Status API יהיה אותו אתר עם כל ישויות האב, ועכשיו אפשר להגדיר את סטטוס ההתחברות של login.idp.example באמצעות כותרת HTTP (Set-Login: logged-in) בדוגמה שלמעלה.

סיכום

באמצעות שימוש ב-ניתוק API, FedCM יכול עכשיו לנתק את ה-RP מה-IdP בלי להסתמך על קובצי cookie של צד שלישי. כדי לעשות זאת, צריך להתקשר אל IdentityCredential.disconnect() בגורם מוגבל. באמצעות הפונקציה הזו, הדפדפן שולח בקשה לנקודת הקצה שנותק ב-IdP כדי שה-IdP יוכל לסיים את החיבור בשרת, ואז בדפדפן.

הודענו שהמערכת מדלגת על הבדיקה /.well-known/web-identity כשה-RP וה-IdP נמצאים באותו אתר, למטרות בדיקה. בנוסף, עכשיו אפשר להגדיר סטטוס התחברות דרך כותרת תגובת HTTP מאותו משאב משנה של IdP.