איך לשמור על עקביות בין מפתחות הגישה לבין פרטי הכניסה בשרת באמצעות Signal API

תאריך הפרסום: 12 בנובמבר 2024, תאריך העדכון האחרון: 29 בנובמבר 2024

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

תאימות

‫Chrome תומך ב-Signal API בכל פלטפורמות המחשב וב-Android.

יש תמיכה ב-Safari אבל היא עדיין לא הוטמעה. עדיין לא קיבלנו את חוות הדעת של Firefox.

מנהל הסיסמאות של Google יכול לעדכן את מפתחות הגישה כדי לשקף את האות. ספקי מפתחות גישה מבוססי-תוסף ל-Chrome במחשב מחליטים אם לשקף את האות.

רקע

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

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

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

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

Signal API

‫Signal API הוא WebAuthn API שפותר את חוסר העקביות הזה בכך שהוא מאפשר ל-RP לשלוח אותות על שינויים לספק מפתחות הגישה. יש שלוש שיטות:

אות לכך שאין פרטי כניסה

const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();

const result = await fetch('/login', { ... });

// Detect authentication failure due to lack of the credential
if (result.status === 404) {
  // Feature detection
  if (PublicKeyCredential.signalUnknownCredential) {
    await PublicKeyCredential.signalUnknownCredential({
      rpId: "example.com",
      credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
    });
  } else {
    // Encourage the user to delete the passkey from the password manager nevertheless.
    ...
  }
}

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

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

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

תיבת דו-שיח שמוצגת כשמפתח גישה נמחק ממנהל הסיסמאות של Google ב-Chrome.
תיבת דו-שיח שמוצגת כשמוחקים מפתח גישה ממנהל הסיסמאות של Google ב-Chrome.

סימון רשימה של פרטי כניסה שמורים

// After a user deletes a passkey or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      ...
    ]
  });
}

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

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

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

האות עדכנה את שם המשתמש והשם המוצג

// After a user updated their username and/or display name
// or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
  await PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    name: "a.new.email.address@example.com", // username
    displayName: "J. Doe"
  });
} else {
}

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

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

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

תיבת דו-שיח שמוצגת כשמטא נתונים של מפתח גישה מתעדכנים במנהל הסיסמאות של Google ב-Chrome.
תיבת דו-שיח שמוצגת כשמטא-נתונים של מפתח גישה מתעדכנים במנהל הסיסמאות של Google ב-Chrome.

סיכום

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

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