פורסם: 9 במאי 2025
מפתחות גישה מספקים אימות חזק ועמיד בפני פישינג. עם זאת, יכול להיות שיהיו קשיים בשכנוע המשתמשים לאמץ אותן. באמצעות יצירה אוטומטית של מפתחות גישה, אתם יכולים ליצור מפתחות גישה למשתמשים שלכם ברגע הנכון, בתנאי שכבר יש להם סיסמה שמורה לאתר שלכם. יצירה מותנית, שמאפשרת יצירה אוטומטית של מפתח גישה, היא חלק ממפרט WebAuthn.
איך זה עובד
כדי לעזור למשתמשים לאמץ את מפתחות הגישה בצורה נוחה יותר, אפשר להשתמש בתכונה של WebAuthn API שנקראת Conditional Create. התכונה 'יצירה מותנית' מאפשרת לאתר שלכם לבקש מהמשתמש מפתח גישה בלי לדרוש ממנו לבצע פעולה כלשהי.
התהליך הזה פועל אם מתקיימים התנאים הבאים:
- למשתמש יש סיסמה שמורה במנהל הסיסמאות שמוגדר כברירת מחדל.
- הסיסמה הייתה בשימוש לאחרונה. מומלץ לקרוא ל-Conditional Create מיד אחרי התחברות מוצלחת שמבוססת על סיסמה.
אם שני התנאים מתקיימים, אפשר לבקש ממנהל הסיסמאות ליצור מפתח גישה עבור המשתמש באמצעות קריאה לפונקציה Conditional Create. אחרי שיוצרים את מפתח הגישה, המשתמש מקבל הודעה בהתאם למנהל הסיסמאות.
תאימות
התכונה 'יצירה מותנית' נתמכת ב-Safari ב-macOS ובכל הדפדפנים ב-iOS, וגם ב-Chrome במחשב וב-Chrome ב-Android.
הטמעה של יצירה מותנית
היצירה האוטומטית של מפתחות גישה מבוססת על תכונה של 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 כדי לשמור על עקביות.
אין תמיכה בשדרוג משימוש בכניסה ללא סיסמה
בשלב הזה, יצירת מפתח גישה מותנית בכך שהמשתמש יזין סיסמה תקינה. המשמעות היא ששיטות כניסה ללא סיסמה, כמו קישורים קסומים, אימות מספר טלפון או איחוד זהויות, לא יעמדו בתנאי.
סיכום
יצירה אוטומטית של מפתחות גישה יכולה להאיץ את השימוש במפתחות גישה באתר שלכם, ולעזור למשתמשים לעבור מסיסמאות לשיטת אימות מאובטחת יותר.
למידע נוסף על מפתחות גישה, אפשר לקרוא את המאמר כניסה ללא סיסמה באמצעות מפתחות גישה.