תאריך הפרסום: 12 בנובמבר 2024, תאריך העדכון האחרון: 29 בנובמבר 2024
ממשק ה-API של WebAuthn Signal מאפשר לצדדים נסמכים לסמן פרטי כניסה קיימים לספקי מפתחות גישה מחוברים. כך ספק מפתחות גישה תומך יכול לעדכן או להסיר מפתחות גישה שגויים או מבוטלים מהאחסון שלו, כדי שהמשתמשים לא יקבלו אותם יותר.
תאימות
Chrome תומך ב-Signal API בכל פלטפורמות המחשב וב-Android.
יש תמיכה ב-Safari אבל היא עדיין לא הוטמעה. עדיין לא קיבלנו את חוות הדעת של Firefox.
מנהל הסיסמאות של Google יכול לעדכן את מפתחות הגישה כדי לשקף את האות. ספקי מפתחות גישה מבוססי-תוסף ל-Chrome במחשב מחליטים אם לשקף את האות.
רקע
כשיוצרים מפתח גישה (פרטי כניסה שאפשר לגלות), המטא-נתונים כמו שם משתמש ושם לתצוגה נשמרים אצל ספק מפתחות הגישה (למשל, מנהל סיסמאות) יחד עם המפתח הפרטי, ואילו פרטי הכניסה של המפתח הציבורי נשמרים בשרת של הצד המסתמך (RP). שמירת שם המשתמש והשם המוצג עוזרת למשתמשים לזהות אילו מפתחות גישה מוצעים להם כדי להיכנס לחשבון כשהם מתבקשים לעשות זאת. האפשרות הזו שימושית במיוחד אם למשתמשים יש יותר משני מפתחות גישה מספקי מפתחות גישה שונים.
עם זאת, יש כמה מקרים שבהם חוסר עקביות בין רשימת מפתחות הגישה של ספק מפתחות הגישה לבין רשימת פרטי הכניסה של השרת עלול לגרום לבלבול.
המקרה הראשון הוא כשמשתמש מוחק אישורי כניסה בשרת. מפתח הגישה לא משתנה אצל ספק מפתחות הגישה. בפעם הבאה שהמשתמש ינסה להיכנס באמצעות מפתח גישה, ספק מפתח הגישה עדיין יציג את מפתח הגישה הזה למשתמש. עם זאת, הניסיון להיכנס לחשבון ייכשל כי השרת לא יכול לאמת את המפתח הציבורי שנמחק.
המקרה השני הוא כשמשתמש מעדכן את שם המשתמש או את השם המוצג בשרת. בפעם הבאה שהמשתמש ינסה להיכנס, מפתח הגישה אצל ספק מפתחות הגישה ימשיך להציג את שם המשתמש הישן ואת השם לתצוגה, גם אם הם עודכנו בשרת. מומלץ שהם יהיו מסונכרנים.
Signal API
Signal API הוא WebAuthn API שפותר את חוסר העקביות הזה בכך שהוא מאפשר ל-RP לשלוח אותות על שינויים לספק מפתחות הגישה. יש שלוש שיטות:
-
PublicKeyCredential.signalUnknownCredential: סימן לכך שאין פרטי כניסה -
PublicKeyCredential.signalAllAcceptedCredentials: הצגת רשימה של פרטי כניסה שמורים -
PublicKeyCredential.signalCurrentUserDetails: Signal updated username and display name
אות לכך שאין פרטי כניסה
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 יכול להודיע לספק מפתחות הגישה שהאישור שצוין הוסר או לא קיים. ספק מפתח הגישה קובע איך לטפל באות הזה, אבל צריך להסיר את מפתח הגישה המשויך כדי שהמשתמשים לא ינסו להיכנס לחשבון באמצעות מפתח גישה שלא משויך אליו אישור.
אפשר להפעיל את ה-API הזה אם הכניסה באמצעות מפתח גישה נכשלה כי אין אישורים.
כך, ספק הזהויות יכול למנוע ממשתמשים לנסות להיכנס באמצעות מפתח גישה שלא משויך לפרטי כניסה. בניגוד לשיטה signalAllAcceptedCredentials, בשיטה הזו לא צריך להעביר את כל רשימת מזהי פרטי הכניסה, ולכן כדאי להשתמש בה בכל פעם שהמשתמש לא מאומת, כדי למנוע חשיפה של מספר מפתחות הגישה של משתמש מסוים.
סימון רשימה של פרטי כניסה שמורים
// 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 ומסומנים כ'מוסתרים'.
כך האתר יוכל לשחזר מפתחות גישה שהוסתרו בטעות.
צריך להפעיל את ה-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 יכול לעדכן את ספק מפתחות הגישה לגבי פרטי המשתמש המעודכנים. ספק מפתחות הגישה קובע איך לטפל באות הזה,
אבל הוא צריך לעדכן את מפתחות הגישה שבבעלות המשתמש בפרטי המשתמש החדשים.
אפשר להפעיל את ה-API הזה כששם המשתמש או השם המוצג של המשתמש מתעדכנים, ובכל כניסה, כדי שספק מפתחות הגישה יוכל לשמור על סנכרון המידע הזה עם השרת.
סיכום
ה-Signal API עוזר לכם ליצור חוויה טובה יותר של מפתחות גישה על ידי ביטול כשלים לא צפויים בכניסה לחשבון. ממשק Signal API מאפשר לצדדים מסתמכים לסמן את רשימת אמצעי הזיהוי הקיימים ואת המטא-נתונים שלהם, כדי שיוכלו לשמור על סנכרון של מפתחות הגישה אצל ספק מפתחות הגישה.
מידע נוסף על מפתחות גישה זמין במאמר כניסה ללא סיסמה באמצעות מפתחות גישה.