אפשר להשתמש שוב במפתחות גישה באתרים שלך באמצעות בקשות מקור קשורות

Maud Nalpas
Maud Nalpas

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

המזהה הזה מצוין במזהה הצד הנסמך (מזהה RP). לדוגמה, למפתחות גישה שנוצרו לדומיין example.com, המזהה יכול להיות www.example.com או example.com.

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

  • אתרים עם כמה דומיינים: משתמשים לא יכולים להשתמש באותו מפתח גישה כדי להיכנס לדומיינים שונים שמוגדרים למדינות שונות (לדוגמה, example.com ו-example.co.uk) ומנוהלים על ידי אותה חברה.
  • דומיינים ממותגים: משתמשים לא יכולים להשתמש באותם פרטי כניסה בדומיינים שונים שבהם נעשה שימוש על ידי מותג אחד (לדוגמה, acme.com ו-acmerewards.com).
  • אפליקציות לנייד: לרוב לאפליקציות לנייד אין דומיין משלהם, ולכן קשה לנהל את פרטי הכניסה שלהן.

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

פתרון

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

כך המשתמשים יוכלו להשתמש שוב באותו מפתח גישה בכמה אתרים שאתם מנהלים.

כדי להשתמש בבקשות ממקורות קשורים, צריך להציג קובץ JSON מיוחד בכתובת URL ספציפית https://{RP ID}/.well-known/webauthn. אם example.com רוצה לאפשר למקורות הנוספים להשתמש בו כמזהה RP, הוא צריך להציג את הקובץ הבא בכתובת https://example.com/.well-known/webauthn:

{
    "origins": [
        "https://example.co.uk",
        "https://example.de",
        "https://example-rewards.com"
    ]
}

בפעם הבאה שאחד מהאתרים האלה יבצע קריאה ליצירת מפתח גישה (navigator.credentials.create) או לאימות (navigator.credentials.get) שמשתמש ב-example.com בתור מזהה RP, הדפדפן יבחין במזהה RP שלא תואם למקור המבקש. אם הדפדפן תומך בבקשות למקורות קשורים, הוא מחפש קודם קובץ webauthn בכתובת https://{RP ID}/.well-known/webauthn. אם הקובץ קיים, הדפדפן בודק אם מקור הבקשה נכלל ברשימת ההיתרים בקובץ הזה. אם כן, הוא ממשיך לשלבים של יצירת מפתח הגישה או האימות. אם הדפדפן לא תומך בבקשות מקורות קשורות, הוא יוצר אירוע SecurityError.

תמיכה בדפדפנים

  • Chrome: נתמך החל מ-Chrome 128.
  • Safari: נתמך החל מ-macOS 15 בטא 3, ובניידים iOS 18 בטא 3.
  • Firefox:‏ Awaiting position.

בדוגמה הבאה נעשה שימוש בשני אתרים, https://ror-1.glitch.me ו-https://ror-2.glitch.me.
כדי לאפשר למשתמשים להיכנס באמצעות אותו מפתח גישה בשני האתרים האלה, המערכת משתמשת בבקשות מקור קשורות כדי לאפשר ל-ror-2.glitch.me להשתמש ב-ror-1.glitch.me בתור מזהה RP שלו.

הדגמה (דמו)

https://ror-2.glitch.me מטמיע בקשות מקורות קשורות כדי להשתמש ב-ror-1.glitch.me כמזהה RP, כך שגם ror-1 וגם ror-2 משתמשים ב-ror-1.glitch.me כמזהה RP כשיוצרים מפתח גישה או מבצעים אימות באמצעותו.
הטמענו גם מסד נתונים משותף של מפתחות גישה באתרים האלה.

בודקים את חוויית המשתמש הבאה:

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

הצגת הקוד:

שלב 1: הטמעת מסד נתונים של חשבון משותף

כדי שהמשתמשים יוכלו להיכנס באמצעות אותו מפתח גישה ב-site-1 וב-site-2, צריך ליצור מסד נתונים של חשבונות שמשותף לשני האתרים האלה.

שלב 2: מגדירים את קובץ ה-JSON של well-known/webauthn באתר-1

קודם כול, מגדירים את site-1.com כך שיאפשר ל-site-2.com להשתמש בו בתור מזהה RP. כדי לעשות זאת, יוצרים את קובץ ה-JSON של webauthn:

{
    "origins": [
        "https://site-2.com"
    ]
}

אובייקט ה-JSON חייב לכלול מפתח בשם 'origins' שהערך שלו הוא מערך של מחרוזת אחת או יותר שמכילות מקורות אינטרנט.

מגבלה חשובה: אפשר להוסיף עד 5 תוויות

כל רכיב ברשימה הזו עובד כדי לחלץ את התוויות של eTLD + 1. לדוגמה, התוויות eTLD + 1 של example.co.uk ו-example.de הן גם example. אבל התווית eTLD + 1 של example-rewards.com היא example-rewards. ב-Chrome, מספר התוויות המקסימלי הוא 5.

שלב 3: הצגת קובץ ה-JSON של well-known/webauthn באתר-1

לאחר מכן, מציגים את קובץ ה-JSON בכתובת site-1.com/.well-known/webauthn.

לדוגמה, ב-Express:

app.get("/.well-known/webauthn", (req, res) => {
  const origins = {
    origins: ["https://site-2.com"],
  };
  return res.json(origins);
});

כאן אנחנו משתמשים ב-express res.json, שכבר מגדיר את content-type הנכון ('application/json');

שלב 4: מציינים את מזהה הגורם המוגבל (RP) הרצוי באתר 2

בקוד של site-2, מגדירים את site-1.com כמזהה RP בכל מקום שבו יש צורך:

  • בזמן היצירה של פרטי הכניסה:
    • מגדירים את site-1.com בתור מזהה RP ביצירת פרטי הכניסה options, שמועברים לקריאה של navigator.credentials.create בחזית, ובדרך כלל נוצרים בצד השרת.
    • מגדירים את site-1.com כמזהה RP הצפוי, כשמריצים אימותים של פרטי הכניסה לפני שמשמרים אותם במסד הנתונים.
  • לאחר האימות:
    • מגדירים את site-1.com כמזהה RP באימות options שמועברים לקריאה של navigator.credentials.get מצד הלקוח, ובדרך כלל נוצרים בצד השרת.
    • מגדירים את site-1.com כמזהה RP צפוי שצריך לאמת בשרת, כי מריצים אימותים של פרטי כניסה לפני אימות המשתמש.

פתרון בעיות

חלון קופץ עם הודעת שגיאה ב-Chrome.
הודעת שגיאה ב-Chrome במהלך היצירה של פרטי הכניסה. השגיאה הזו תופיע אם הקובץ ' .well-known/webauthn' לא נמצא בכתובת 'https://{RP ID}/.well-known/webauthn'.
חלון קופץ עם הודעת שגיאה ב-Chrome.
הודעת השגיאה ב-Chrome בזמן היצירה של פרטי הכניסה. השגיאה הזו מתקבלת אם ניתן למצוא את הקובץ ‎well-known/webauthn.‎, אבל הוא לא מציג את המקור שממנו מנסים ליצור פרטי כניסה.

שיקולים נוספים

שיתוף מפתחות גישה בין אתרים ואפליקציות לנייד

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

שיתוף סיסמאות בין אתרים

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

התפקיד של מנהלי פרטי הכניסה ושל סוכני המשתמשים

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