תאריך פרסום: 9 במאי 2025, תאריך העדכון האחרון: 22 בדצמבר 2025
מפתחות גישה מספקים אימות חזק ועמיד בפני פישינג. עם זאת, יכול להיות שיהיו קשיים בשכנוע המשתמשים לאמץ אותן. באמצעות יצירה אוטומטית של מפתחות גישה, אתם יכולים ליצור מפתחות גישה למשתמשים שלכם ברגע הנכון, בתנאי שכבר יש להם סיסמה שמורה לאתר שלכם. יצירה מותנית, שמאפשרת יצירה אוטומטית של מפתח גישה, היא חלק ממפרט WebAuthn.
איך זה עובד
כדי לעזור למשתמשים לאמץ את מפתחות הגישה בצורה נוחה יותר, אפשר להשתמש בתכונה של WebAuthn API שנקראת Conditional Create. התכונה 'יצירה מותנית' מאפשרת לאתר לבקש מהמשתמש מפתח גישה בלי לדרוש ממנו לבצע פעולה כלשהי.
התהליך הזה פועל אם מתקיימים התנאים הבאים:
- למשתמש יש סיסמה שמורה במנהל הסיסמאות שמוגדר כברירת מחדל.
- הסיסמה הייתה בשימוש לאחרונה. מומלץ לקרוא ל-Conditional Create מיד אחרי התחברות מוצלחת שמבוססת על סיסמה.
אם שני התנאים מתקיימים, אפשר לבקש ממנהל הסיסמאות ליצור מפתח גישה עבור המשתמש באמצעות קריאה ל-Conditional Create. אחרי שמפתח הגישה נוצר בהצלחה, המשתמש מקבל הודעה בהתאם למנהל הסיסמאות.
תאימות
התכונה 'יצירה מותנית' נתמכת ב-Safari ב-macOS ובכל הדפדפנים ב-iOS, וגם ב-Chrome במחשב וב-Chrome ב-Android.
התמיכה הזו מאפשרת שימוש בספקי מפתחות הגישה שמוגדרים כברירת מחדל: iCloud Keychain (Passwords) ב-Safari ב-macOS וב-iOS, ו-Google Password Manager ב-Chrome במחשב וב-Android.
מערכות iOS מגרסה 18 ואילך ו-Android מגרסה 14 ואילך תומכות בספקי מפתחות גישה של צד שלישי, ללא קשר לדפדפן שבו המשתמש משתמש. לכן, התמיכה ביצירה מותנית תלויה בספק מפתחות הגישה. אם ספק מפתחות הגישה שנבחר לא תומך ביצירה מותנית, לא ייווצר מפתח גישה חדש.
הטמעה של יצירה מותנית
היצירה האוטומטית של מפתחות גישה מבוססת על תכונה של WebAuthn API שנקראת Conditional Create. אלה בקשות רגילות של WebAuthn create() עם הפרמטר mediation שמוגדר לערך "conditional", והן פועלות באופן דומה למילוי אוטומטי של מפתחות גישה לבקשות של get().
משתמשים ב-Conditional Create אחרי שהמשתמש נכנס באמצעות סיסמה. האם היצירה תצליח תלוי במנהל הסיסמאות ובתנאים מסוימים שצריכים להתקיים. התנאים האלה משתנים בהתאם למנהל הסיסמאות, ויכולים להשתנות עם הזמן. לדוגמה, ב-Chrome עם מנהל הסיסמאות של Google (GPM), המשתמש צריך להיכנס לאחרונה באמצעות סיסמה שמורה לאתר.
אם הדפדפן יוצר את מפתח הגישה בהצלחה, הוא מחזיר אישור של מפתח ציבורי. שולחים את פרטי הכניסה האלה לשרת העורפי כדי להשלים את הרישום ולאפשר אימות בעתיד.
זיהוי תכונות
כדי לבדוק אם התכונה 'יצירה מותנית' זמינה בדפדפן, צריך להפעיל את PublicKeyCredential.getClientCapabilities(). בודקים אם אובייקט שהוחזר מכיל את הערך true בתכונה conditionalCreate.
if (window.PublicKeyCredential && PublicKeyCredential.getClientCapabilities) {
const capabilities = await PublicKeyCredential.getClientCapabilities();
if (capabilities.conditionalCreate) {
// Conditional create is available
}
}
אם getClientCapabilities לא זמין, גם Conditional Create לא זמין.
יצירת מפתח גישה בתנאי
כדי ליצור מפתח גישה באופן אוטומטי, מפעילים את navigator.credentials.create() אבל עם mediation: "conditional", כמו בדוגמה הבאה.
const cred = await navigator.credentials.create({
publicKey: options,
// Request conditional creation
mediation: 'conditional'
});
כדי להגדיל את הסיכוי שהסיסמה תעמוד בקריטריונים של מנהל הסיסמאות ליצירה אוטומטית, מומלץ להשתמש ביצירה אוטומטית של מפתחות גישה מיד אחרי שהמשתמש נכנס לחשבון.
אפשר לשלוח את פרטי הכניסה של המפתח הציבורי שנוצר לשרת כדי לאמת ולרשום את מפתח הגישה. בשרת, מוודאים שהמשתמש מחובר לחשבון.
נקודות שצריך לשים לב אליהן:
הטמעה של Conditional Create בפני עצמה היא לא מסובכת, אבל יש כמה נקודות חשובות כשמשלבים את התכונה הזו במערכת קיימת.
התעלמות מנוכחות המשתמש ואימות המשתמש בשרת
התגובה להרשמה מחזירה את הערך false גם עבור User Presence וגם עבור User Verified, ולכן השרת צריך להתעלם מהדגלים האלה במהלך אימות פרטי הכניסה.
ביטול שיחת WebAuthn שמתבצעת לפני יצירה אוטומטית של מפתח גישה
כשספק השירות מצפה שהמשתמש ייכנס באמצעות מפתח גישה או סיסמה, האפשרות הטובה ביותר היא לבצע בקשת GET מותנית. יכול להיות שהפעולה הזו תגרום לביטול של קריאת ה-GET המותנית לפני ביצוע יצירה מותנית.
כדי לעשות את זה, צריך להשתמש ב-AbortController ולהתקשר אל .abort().
// To abort a WebAuthn call, instantiate an AbortController.
const controller = new AbortController();
const cred = await navigator.credentials.get({
publicKey: options,
signal: controller.signal,
// Request conditional get
mediation: 'conditional'
});
// Abort the call
controller.abort();
התעלמות מהחריגים בצורה אלגנטית
כשמבצעים יצירה מותנית של מפתח גישה, יש כמה מקרים שבהם כדאי להתעלם מחריגים:
-
InvalidStateError: כבר קיים מפתח גישה אצל ספק מפתחות הגישה (חשוב לציין אתexcludeCredentials). -
NotAllowedError: יצירת מפתח גישה לא עומדת בתנאי. -
AbortError: השיחה של WebAuthn מבוטלת.
הצגת שגיאות במקרים האלה עלולה לבלבל את המשתמש, כי הדפדפן מטפל בהן באופן שקט: הוא מציג התראה רק אם הפעולה הצליחה, ואם היא נכשלת לא מוצגות הודעות גלויות.
אות כשרישום מפתח הגישה נכשל
כשמפתח גישה נוצר אבל הרישום שלו בשרת נכשל, המשתמש יחווה ניסיון כניסה שנכשל. מצב כזה יכול לקרות כשיש חוסר עקביות בין רשימת מפתחות הגישה אצל ספק מפתחות הגישה לבין הרשימה בשרת.
כדי להימנע ממצבים כאלה, משתמשים ב-Signal API כדי לשמור על עקביות.
אין תמיכה בשדרוג משימוש בכניסה ללא סיסמה
בשלב הזה, יצירת מפתח גישה מותנית בכך שהמשתמש יזין סיסמה תקינה. המשמעות היא ששיטות כניסה ללא סיסמה, כמו קישורים קסומים, אימות מספר טלפון או איחוד זהויות, לא עומדות בתנאי.
סיכום
יצירה אוטומטית של מפתחות גישה יכולה להאיץ את השימוש במפתחות גישה באתר שלכם, ולעזור למשתמשים לעבור מסיסמאות לשיטת אימות מאובטחת יותר.
למידע נוסף על מפתחות גישה, אפשר לקרוא את המאמר כניסה ללא סיסמה באמצעות מפתחות גישה.