החל מגרסה 122 של Chrome, יש ניתוק API של Federated Credential Management API (FedCM). ה-ניתוק API מאפשר לצדדים נסמך לנתק את המשתמשים שלהם מהחשבון של ספק הזהויות בלי להסתמך על קובצי cookie של צד שלישי. בנוסף, יש כמה עדכונים לגבי הטיפול ב-SameSite ב-FedCM.
Disconnect API
כשמשתמש יוצר חשבון בצד נסמך (RP – האתר שמשתמש בספק הזהויות לצורך אימות) דרך איחוד שירותי אימות הזהות, ספק הזהויות (IdP – השירות שמספק אימות ומידע על החשבון לצדדים אחרים) בדרך כלל מתעד את החיבור בשרת שלו. החיבור המאוחסן מאפשר ל-IdP לעקוב אחרי ספקי ה-RP שהמשתמש נכנס אליהם ולבצע אופטימיזציה של חוויית המשתמש. לדוגמה, כדי לספק חוויה טובה יותר כשהמשתמש יחזור ל-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, הדפדפן שומר את הקשר באופן מקומי כרשימה של החשבונות המקושרים. ה-RP יכול ליזום ניתוק על ידי הפעלה של הפונקציה 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 צריך לתמוך בנקודת קצה (endpoint) של ניתוק ולספק את המאפיין disconnect_endpoint
ואת הנתיב שלו בקובץ התצורה
של ה-IdP.
{
"accounts_endpoint": "/accounts",
"id_assertion_endpoint": "/assertion",
...
"disconnect_endpoint: "/disconnect"
}
ניתוק החשבון בנקודת הקצה (endpoint) של הניתוק
על ידי הפעלת IdentityCredential.disconnect()
, הדפדפן שולח בקשת POST
ממקורות שונים עם קובצי cookie וסוג תוכן של application/x-www-form-urlencoded
לנקודת הקצה הזו של הניתוק עם המידע הבא:
נכס | תיאור |
---|---|
account_hint |
רמז לחשבון IdP. |
client_id |
מזהה הלקוח של RP. |
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 צריך:
- משיבים לבקשה באמצעות CORS (שיתוף משאבים בין מקורות).
- מוודאים שהבקשה מכילה כותרת HTTP מסוג
Sec-Fetch-Dest: webidentity
. - המערכת תשווה את הכותרת
Origin
למקור ה-RP שנקבע על ידיclient_id
. אם הם לא תואמים, דוחים אותם. - מאתרים את החשבון שתואם ל-
account_hint
. - מנתקים את חשבון המשתמש מרשימת החשבונות המחוברים של הגורם המוגבל.
- משיבים לדפדפן עם הערך של
account_id
של המשתמש שזוהה בפורמט JSON.
דוגמה למטען ייעודי (payload) של JSON עם תגובה:
{
"account_id": "account456"
}
אם ה-IdP רוצה שהדפדפן ינתק במקום זאת את כל החשבונות המשויכים ל-RP, צריך להעביר מחרוזת שלא תואמת למספר חשבון כלשהו, למשל "*"
.
המערכת מדלגת על הבדיקה של /.well-known/web-identity
כשה-RP וה-IdP הם באותו אתר
כשמפתחים מערכת FedCM, דומיינים של שרת RP לבדיקה או ל-staging עשויים להיות תת-דומיינים של שרת ה-IdP בסביבת הייצור. לדוגמה, שרת ה-IdP של סביבת הייצור נמצא ב-idp.example
, וגם שרת ה-RP ב-Staging וגם שרת ה-IdP ב-Staging נמצאים ב-staging.idp.example
. עם זאת, מכיוון שקובץ ה-well-known חייב להיות ממוקם ברמה הבסיסית (root) של ה-eTLD+1 של שרת ה-IdP, הוא חייב להיות ב-idp.example/.well-known/web-identity
והוא השרת בסביבת הייצור. מכיוון שלא בטוח שמפתחים יכולים להציב קבצים בסביבת הייצור בזמן הפיתוח, הם לא יכולים לבדוק את FedCM.
החל מ-Chrome 122, אם דומיין ה-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
).
סיכום
באמצעות Disconnect API, FedCM יכול עכשיו לנתק את RP מה-IdP בלי להסתמך על קובצי cookie של צד שלישי. כדי לעשות זאת, צריך להפעיל את IdentityCredential.disconnect()
בגורם המוגבל. באמצעות הפונקציה הזו, הדפדפן
שולח בקשה לנקודת הקצה (endpoint) של הניתוק ב-IdP כדי שה-IdP יוכל לסיים את החיבור בשרת, ולאחר מכן בדפדפן.
הכרזנו על דילוג על הבדיקה של /.well-known/web-identity
כשה-RP וה-IdP הם באותו אתר, למטרות בדיקה. בנוסף, עכשיו אפשר גם להגדיר סטטוס התחברות דרך כותרת תגובת HTTP מאותו משאב משנה של IdP באותו אתר.