הטמעת פתרון זהויות באמצעות FedCM בצד של הצד הנסמך

צדדים מסתמכים (RP) צריכים לבצע את השלבים הבאים כדי להפעיל FedCM באתר שלהם:

שליחת קריאה ל-FedCM API ב-Relying Party

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

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

  if ('IdentityCredential' in window) {
    // If the feature is available, take action
  } else {
    // FedCM is not supported, use a different identity solution
  }

כדי לאפשר למשתמש להיכנס ל-IdP ב-RP באמצעות FedCM, ה-RP יכול לקרוא ל-navigator.credentials.get(). החל מ-Chrome 136, ספק שירות יכול לתמוך בכמה ספקי זהויות על ידי ציון מערך של כמה ספקי זהויות בקריאה אחת של navigator.credentials.get(), לדוגמה:

  const credential = await navigator.credentials.get({
      identity: {
        // Specify the IdP (or multiple IdPs, supported from Chrome 136) this Relying Party supports
        providers: [
        {
              configURL: 'https://accounts.idp-1.example/config.json',
              clientId: '********'
        },
        {
          configURL: 'https://accounts.idp-2.example/config.json',
          clientId: '********'
        }]
      }
    },
  );
  const { token } = credential;

  // Get the current IdP's configURL to identify which provider the user is signed in with
  const currentIdpConfigUrl = credential.configURL;
  if (currentIdpConfigUrl === 'https://idp1.example/foo.json') {
    // handle the case where the user signed in with idp1
  } else if (currentIdpConfigUrl === 'https://idp2.example/bar.json') {
    // handle the case where the user signed in with idp2
    }

כדי לנסות את התכונה של כמה ספקי IdP, צריך להיכנס באמצעות IdP1 ו-IdP2.

מאפיין הקשר

באמצעות המאפיין האופציונלי context, ה-RP יכול לשנות את המחרוזת בממשק המשתמש של תיבת הדו-שיח של FedCM (לדוגמה, 'כניסה אל rp.example…', 'שימוש ב-idp.example…') כדי להתאים להקשרים מוגדרים מראש של אימות, למשל. המאפיין context יכול לקבל את הערכים הבאים:

  • signin (ברירת מחדל)
  • signup
  • use
תרשים שמסביר את רכיבי ממשק המשתמש של תיבת הדו-שיח של FedCM: בצד ימין למעלה מוצג סמל. משמאל לסמל מוצג רכיב הקשר עם ההודעה 'כניסה ל-RP באמצעות IdP'. בתחתית יש לחצן 'המשך' עם טקסט וצבע רקע בהתאמה אישית.
איך המיתוג מוחל על תיבת הדו-שיח של FedCM

לדוגמה, אם מגדירים את context ל-use, תוצג ההודעה הבאה:

תיבת דו-שיח של FedCM שבה מוצגת הודעת הקשר בהתאמה אישית: במקום 'כניסה' באמצעות FedCM, הודעת ההקשר היא 'שימוש' ב-FedCM.
תיבת דו-שיח של FedCM עם הודעת הקשר מותאמת אישית.

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

המאפיין providers מקבל מערך של אובייקטים מסוג IdentityProvider עם המאפיינים הבאים:

מאפיין הספקים

המאפיין providers מקבל מערך של אובייקטים מסוג IdentityProvider עם המאפיינים הבאים:

נכס תיאור
configURL (חובה) נתיב מלא של קובץ התצורה של ספק הזהויות.
clientId (חובה) מזהה הלקוח של ה-RP, שהונפק על ידי ה-IdP.
ֶloginHint (אופציונלי) אם מציינים אחד מ-login_hints הערכים שמופיעים בנקודות הקצה של החשבונות, תיבת הדו-שיח של FedCM מציגה באופן סלקטיבי את החשבון שצוין.
ֶdomainHint (אופציונלי) אם מציינים אחד מ-domain_hints הערכים שמופיעים בנקודות הקצה של החשבונות, תיבת הדו-שיח של FedCM מציגה באופן סלקטיבי את החשבון שצוין.
ֶmode (אופציונלי) מחרוזת שמציינת את מצב ממשק המשתמש של FedCM. הערך יכול להיות אחד מהערכים הבאים:
  • "active": חלון ההנחיה של FedCM חייב להיות מופעל על ידי אינטראקציה של המשתמש (למשל, לחיצה על לחצן).
  • "passive": תופעל הנחיה של FedCM ללא אינטראקציה ישירה של המשתמש.
בדף הסקירה הכללית אפשר לקרוא מידע נוסף על ההבדל בין מצב פעיל למצב סביל.

הערה: הפרמטר mode נתמך מגרסה Chrome 132.
ֶfields (אופציונלי) מערך של מחרוזות שמציין את פרטי המשתמש שספק ה-IdP צריך לשתף עם ה-RP. אפשר לציין את השדות הבאים:
  • "name"
  • "username"
  • "email"
  • "tel"
  • "picture"
הערה: Fields API נתמך ב-Chrome 132 ואילך. השדות "username" ו-"tel" נתמכים מגרסה Chrome 141.
ֶparams (אופציונלי) אובייקט מותאם אישית שמאפשר לציין פרמטרים נוספים של מפתח/ערך:
  • scope: ערך מחרוזת שמכיל הרשאות נוספות שספק הזהויות צריך לבקש, לדוגמה "drive.readonly calendar.readonly"
  • nonce: מחרוזת אקראית כדי לוודא שהתשובה מונפקת לבקשה הספציפית הזו. מונעת התקפות חוזרות.
  • פרמטרים מותאמים אישית אחרים של מפתח/ערך.

הערה: params נתמך מגרסה Chrome 132.

מצב פעיל

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

כדי להשתמש ב-FedCM במצב פעיל:

  1. בודקים את זמינות התכונה בדפדפן של המשתמש.
  2. מפעילים את ה-API באמצעות תנועת משתמש חולפת, כמו לחיצה על כפתור.
  3. מעבירים את הפרמטר mode לקריאה ל-API:
  let supportsFedCmMode = false;
  try {
    navigator.credentials.get({
      identity: Object.defineProperty(
        // Check if this Chrome version supports the Mode API.
        {}, 'mode', {
          get: function () { supportsFedCmMode = true; }
        }
      )
    });
  } catch(e) {}

  if (supportsFedCmMode) {
    // The button mode is supported. Call the API with mode property:
    return await navigator.credentials.get({
      identity: {
        providers: [{
          configURL: 'https://idp.example/config.json',
          clientId: '123',
        }],
        // The 'mode' value defines the UX mode of FedCM.
        // - 'active': Must be initiated by user interaction (e.g., clicking a button).
        // - 'passive': Can be initiated without direct user interaction.
        mode: 'active'
      }
    });
  }

כאן אפשר לנסות את המצב הפעיל.

סמל מותאם אישית במצב פעיל

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

קריאה ל-FedCM מתוך iframe חוצה-מקורות

אפשר להפעיל את FedCM מתוך iframe חוצה מקור באמצעות מדיניות הרשאות identity-credentials-get, אם מסגרת ההורה מאפשרת זאת. כדי לעשות זאת, מוסיפים את המאפיין allow="identity-credentials-get" לתג ה-iframe באופן הבא:

  <iframe src="https://fedcm-cross-origin-iframe.glitch.me" allow="identity-credentials-get"></iframe>

דוגמה

אופציונלי: אם הפריים הראשי רוצה להגביל את המקורות לקריאה ל-FedCM, הוא צריך לשלוח כותרת Permissions-Policy עם רשימה של מקורות מורשים.

  Permissions-Policy: identity-credentials-get=(self "https://fedcm-cross-origin-iframe.glitch.me")

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

Login Hint API

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

ה-RP יכול להציג חשבון ספציפי על ידי הפעלת navigator.credentials.get() עם המאפיין loginHint ואחד מהערכים login_hints שאוחזרו מנקודת הקצה של רשימת החשבונות, כמו בדוגמת הקוד הבאה:

  return await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/manifest.json',
        clientId: '123',
        // Accounts endpoint can specify a 'login_hints' array for an account.
        // When RP specifies a 'exampleHint' value, only those accounts will be
        // shown to the user whose 'login_hints' array contains the 'exampleHint'
        // value
        loginHint : 'exampleHint'
      }]
    }
  });

אם אין חשבונות שתואמים ל-loginHint, מוצגת תיבת דו-שיח של FedCM עם הנחיה להתחברות, שמאפשרת למשתמש להתחבר לחשבון בספק הזהויות שתואם לרמז שביקש ה-RP. כשהמשתמש מקיש על ההנחיה, נפתח חלון דו-שיח עם כתובת ה-URL להתחברות שצוינה בקובץ ההגדרות. לאחר מכן, הקישור יצורף עם רמז הכניסה ופרמטרים של שאילתת רמז הדומיין.

Domain Hint API

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

כדי להציג רק חשבונות של דומיין ספציפי, ספק ה-RP צריך לבצע קריאה ל-navigator.credentials.get() עם המאפיין domainHint ואחד מהערכים domain_hints שאוחזרו מנקודת הקצה של רשימת החשבונות, כמו בדוגמת הקוד הבאה:

  return await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/manifest.json',
        clientId: 'abc',
        // Accounts endpoint can specify a 'domain_hints' array for an account.
        // When RP specifies a '@domain.example' value, only those accounts will be
        // shown to the user whose 'domain_hints' array contains the
        // '@domain.example' value
        domainHint : '@domain.example'
      }]
    }
  });

אם אין חשבונות שתואמים ל-domainHint, מוצגת תיבת דו-שיח של FedCM עם הנחיה להתחברות, שמאפשרת למשתמש להתחבר לחשבון בספק הזהויות שתואם לרמז שביקש ה-RP. כשהמשתמש מקיש על ההנחיה, נפתח חלון דו-שיח עם כתובת ה-URL להתחברות שצוינה בקובץ ההגדרות. לאחר מכן, הקישור יצורף עם רמז הכניסה ופרמטרים של שאילתת רמז הדומיין.

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

פרטים נוספים זמינים בהדגמה.

פרמטרים מותאמים אישית

התכונה 'פרמטרים מותאמים אישית' מאפשרת לספק פרמטרים נוספים של ערכי מפתח לנקודת הקצה של הצהרת הזהות. בעזרת Parameters API, ספקי RP יכולים להעביר פרמטרים נוספים לספק ה-IdP כדי לבקש הרשאות למשאבים מעבר לכניסה בסיסית. העברת פרמטרים נוספים יכולה להיות שימושית בתרחישים הבאים:

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

כדי להשתמש ב-API, ספק ה-RP מוסיף פרמטרים לנכס params כאובייקט בקריאה navigator.credentials.get():

  let {token} = await navigator.credentials.get({
    identity: {
      providers: [{
        clientId: '1234',
        configURL: 'https://idp.example/fedcm.json',
        // Key/value pairs that need to be passed from the
        // RP to the IdP but that don't really play any role with
        // the browser.
        params: {
          IDP_SPECIFIC_PARAM: '1',
          foo: 'BAR'
        }
      },
    }
  });

הדפדפן יתרגם את זה אוטומטית לבקשת POST ל-IdP עם פרמטרים כאובייקט יחיד שעבר סריאליזציה בפורמט JSON עם קידוד כתובת URL:

  // The assertion endpoint is drawn from the config file
  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

  // params are translated into urlencoded version of `{"IDP_SPECIFIC_PARAM":"1","foo":"bar"}`
  account_id=123&client_id=client1234&params=%22%7B%5C%22IDP_SPECIFIC_PARAM%5C%22%3A1%2C%5C%22foo%5C%22%3A%5C%22BAR%5C%22%7D%22.

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

  if (rpRequestsPermissions) {
    // Response with a URL if the RP requests additional permissions
    return res.json({
      continue_on: '/example-redirect',
    });
  }

שדות

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

משתמשים שנרשמים יראו הודעה שמודיעה להם שאם הם יבחרו להירשם, idp.example ישתף את המידע המבוקש עם rp.example. אם התגובה מנקודת הקצה של החשבונות לא כוללת שדה שהסתמכות הצד השלישי ביקשה, טקסט הגילוי הנאות לא יכלול את השדה הזה. ספק הזהויות ילמד את כל השדות הנדרשים מנקודת הקצה של הצהרת הזהות ויחליט אם צריך לאסוף הרשאת משתמש נוספת כדי להמשיך.

תיבת דו-שיח של FedCM, כולל טקסט הגילוי הנאות הבא בממשק המשתמש: &#39;כדי להמשיך, fedcm-idp-demo.localhost ישתף את שם המשתמש ומספר הטלפון שלך עם האתר הזה&#39;.
הודעת גילוי נאות: ספק ה-RP מבקש מספק ה-IdP לשתף רק את שם המשתמש ומספר הטלפון.

כדי להשתמש בתכונה Fields, צריך להוסיף מערך fields בקריאה navigator.credentials.get(). השדות יכולים להכיל מאפיינים כמו name,‏ email,‏ tel,‏ username או picture. יכול להיות שבעתיד נוסיף עוד ערכים. בקשה עם fields תיראה כך:

   let { token } = await navigator.credentials.get({
    identity: {
      providers: [{
        // RP requests the IdP to share only username and profile picture
        fields: [ 'username', 'picture'],
        clientId: '1234',
        configURL: 'https://idp.example/fedcm.json',
      },
    }
  });

הדפדפן יתרגם את הבקשה באופן אוטומטי לבקשת HTTP אל נקודת הקצה של הצהרת הזהות, שכוללת את הפרמטר fields שצוין על ידי ספק הזהות, עם השדות שהדפדפן חשף למשתמש בפרמטר disclosure_shown_for. לצורך תאימות לאחור, הדפדפן ישלח גם את disclosure_text_shown=true אם טקסט הגילוי הנאות הוצג והשדות המבוקשים כוללים את כל שלושת השדות: 'name',‏ 'email' ו-'picture'. החל מגרסה Chrome 141, הערך של disclosure_text_shown לא מציין אם טקסט הגילוי הנאות הוצג בפועל למשתמש.

  POST /id_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

  // The RP only requested to share email and picture. The browser will send `disclosure_text_shown=false`, as the 'name' field value is missing
  account_id=123&client_id=client1234&disclosure_text_shown=false&fields=email,picture&disclosure_shown_for=email,picture

אם fields הוא מערך ריק, סוכן המשתמש ידלג על ממשק המשתמש של הגילוי הנאות.

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

זה קורה גם אם התגובה מנקודת הקצה של החשבונות לא מכילה מזהה לקוח שתואם ל-RP ב-approved_clients.

במקרה הזה, הערך של disclosure_text_shown שנשלח אל נקודת הקצה של הצהרת הזהות הוא false בגוף ה-HTTP:

  POST /id_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=234234&disclosure_text_shown=false

הצגת הודעת שגיאה

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

תיבת דו-שיח של FedCM שבה מוצגת הודעת השגיאה אחרי שניסיון הכניסה של המשתמש נכשל. המחרוזת משויכת לסוג השגיאה.
תיבת דו-שיח של FedCM שבה מוצגת הודעת השגיאה אחרי שהניסיון של המשתמש להתחבר נכשל. המחרוזת משויכת לסוג השגיאה.
  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;
  }

אימות מחדש אוטומטי של משתמשים אחרי האימות הראשוני

אימות מחדש אוטומטי באמצעות FedCM (בקיצור: auto-reauthn) מאפשר למשתמשים לבצע אימות מחדש באופן אוטומטי. התנאים הבאים צריכים להתקיים כדי שהמשתמש יאומת מחדש באופן אוטומטי:

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

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

באימות מחדש אוטומטי, ההתנהגות של הדפדפן משתנה בהתאם לאפשרות שמציינים עבור mediation כשמפעילים את navigator.credentials.get().

  const cred = await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/fedcm.json',
        clientId: '1234',
      }],
    },
    mediation: 'optional', // this is the default
  });

  // `isAutoSelected` is `true` if auto-reauthn was performed.
  const isAutoSelected = cred.isAutoSelected;

המאפיין mediation הוא מאפיין ב-Credential Management API, והוא מתנהג באותו אופן כמו שהוא מתנהג ב-PasswordCredential וב-FederatedCredential. הוא נתמך באופן חלקי גם ב-PublicKeyCredential. המאפיין מקבל את ארבעת הערכים הבאים:

  • 'optional'(ברירת מחדל): אימות מחדש אוטומטי אם אפשר, נדרשת תיווך אם לא. מומלץ לבחור באפשרות הזו בדף הכניסה.
  • 'required': תמיד נדרשת התערבות כדי להמשיך, למשל לחיצה על הלחצן 'המשך' בממשק המשתמש. בוחרים באפשרות הזו אם המשתמשים צפויים לתת הרשאה במפורש בכל פעם שהם צריכים לעבור אימות.
  • 'silent': אימות מחדש אוטומטי אם אפשר, או כשל שקט בלי לדרוש תהליך בחירת רשת אם אי אפשר. מומלץ לבחור באפשרות הזו בדפים שאינם דף הכניסה הייעודי, אבל שבהם רוצים שהמשתמשים יישארו מחוברים – למשל, דף פריט באתר משלוחים או דף כתבה באתר חדשות.
  • 'conditional': משמש ל-WebAuthn ולא זמין ל-FedCM כרגע.

בשיחה הזו, אימות מחדש אוטומטי מתבצע בתנאים הבאים:

  • אפשר להשתמש ב-FedCM. לדוגמה, המשתמש לא השבית את FedCM באופן גלובלי או עבור ה-RP בהגדרות.
  • המשתמש השתמש רק בחשבון אחד עם FedCM API כדי להיכנס לאתר בדפדפן הזה.
  • המשתמש מחובר לספק הזהות באמצעות החשבון הזה.
  • האימות מחדש האוטומטי לא התבצע ב-10 הדקות האחרונות.
  • ספק הזהות לא התקשר אל navigator.credentials.preventSilentAccess() אחרי הכניסה הקודמת.

כשמתקיימים התנאים האלה, מתחיל ניסיון לאימות מחדש של המשתמש באופן אוטומטי ברגע שמפעילים את FedCM navigator.credentials.get().

כש-mediation: optional, יכול להיות שהאימות מחדש האוטומטי לא יהיה זמין בגלל סיבות שרק הדפדפן יודע עליהן. ספק השירות יכול לבדוק אם האימות מחדש האוטומטי בוצע על ידי בדיקת המאפיין isAutoSelected.

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

משתמש עובר אימות מחדש באופן אוטומטי באמצעות FedCM.

החלת בחירת רשת באמצעות preventSilentAccess()

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

  function signout() {
    navigator.credentials.preventSilentAccess();
    location.href = '/signout';
  }

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

המשתמשים יכולים להשבית את האימות מחדש האוטומטי בתפריט ההגדרות:

  • ב-Chrome במחשב, עוברים אל chrome://password-manager/settings > כניסה אוטומטית.
  • ב-Chrome ל-Android, פותחים את ההגדרות > מנהל הסיסמאות > מקישים על סמל גלגל השיניים בפינה השמאלית העליונה > כניסה אוטומטית.

המשתמשים יכולים להשבית את המתג כדי לבטל את ההתנהגות של אימות מחדש אוטומטי לחלוטין. ההגדרה הזו נשמרת ומסונכרנת בין מכשירים, אם המשתמש מחובר לחשבון Google במופע Chrome והסנכרון מופעל.

ניתוק ספק הזהויות מספק השירות

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

  // 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. יכול להיות שההבטחה הזו תזרוק חריגה מהסיבות הבאות:

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

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