ה-API של מיקום גיאוגרפי הוסר ממקורות לא מאובטחים ב-Chrome 50

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

החל מגרסה 50 של Chrome, Chrome לא תומך יותר בקבלת מיקום המשתמש באמצעות HTML5 Geolocation API מדפים שמסופקים על ידי חיבורים לא מאובטחים. כלומר, צריך להציג את הדף שמבצע את הקריאה ל-Geolocation API מהקשר מאובטח כמו HTTPS.

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

מתי זה קורה?

השינוי הזה ייכנס לתוקף ב-Chrome בשעה 50 (שעון החוף המערבי של ארה"ב, 20 באפריל 2016).

במסוף הכלים למפתחים של Chrome מוצגות אזהרות מגרסה 44 (שהושקה ב-21 ביולי 2015).
פורסמו כמה הודעות לציבור שתארו את הנימוקים (והדיונים) לסיבת השינוי:

היו כמה מקורות נוספים שהדגישו זאת: Mobiforge (26 בינואר 2016), Wired (17 במרץ 2016), VentureBeat (13 באפריל 2016).

מדוע Google מבצעת שינוי זה?

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

על מי השינוי הזה משפיע?

המדיניות הזו משפיעה על כל דף שמשתמש כרגע ב-Geolocation API מדפים שמוצגים באמצעות HTTP (לא מאובטח). היא משפיעה גם על מסגרות HTTPS שמשתמשות ב-Geolocation API אם הן מוטמעות בדפי HTTP. (לא תוכלו לבצע מילוי חוזר באמצעות מסגרת משותפת שמסופקת על ידי HTTPS).

האם בכל אפליקציית האינטרנט שלי צריך HTTPS?

לא חובה להציג את כל האפליקציה באמצעות HTTPS כדי להשתמש במיקום גיאוגרפי. יש להציג רק דפים שנעשה בהם שימוש במיקום גיאוגרפי באמצעות הקשר מאובטח. הקשר מאובטח הוא כל מה שמתארח ברמה העליונה ב-HTTPS או ב-localhost. לדוגמה, iframe שמפנה למקור מאובטח אבל מתארח במקור לא מאובטח (http ://paul.kinlan.me/) לא יורשה להפעיל את ה-API של מיקום גיאוגרפי.

מומלץ מאוד לעבור ל-HTTPS, מכיוון שתכונות דפדפן חדשות וקיימות מחייבות מקורות מאובטחים.

האם השינוי הזה משפיע על הפיתוח המקומי?

כמו כן, לא מדובר ב-localhost הוגדר במפרט כ'יכול להיות מאובטח', ובמקרה שלנו בקשות למיקום גיאוגרפי שמוגשות ברמה העליונה במקום מארח מקומי ימשיכו לפעול.

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

כן. במפרט של מיקום גיאוגרפי מוגדר אובייקט PositionError שמועבר אל הכשל בקריאה החוזרת (callback) של ממשקי ה-API של Geolocation. האובייקט מגדיר את המאפיינים code ו-message.

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

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

navigator.geolocation.getCurrentPosition(success => {
    /* Do some magic. */
}, failure => {
    if (failure.message.startsWith("Only secure origins are allowed")) {
    // Secure Origin issue.
    }
});

חשוב לזכור: לא ניתן רק לבדוק את מקור הדף מכיוון שהדף יכול להיות ב-https, אלא בתוך iframe שמתארח בהקשר לא מאובטח.

מה עלי לעשות?

אם אתם רוצים להשתמש ב-HTML5 Geolocation API, או אם האתר שלכם כבר משתמש ב-Geolocation API, עליכם להעביר את הדפים שמבצעים קריאות ל-Geolocation API ל-HTTPS, כדי לוודא שנעשה בהם שימוש בהקשר מאובטח.

יש כמה אפשרויות זמינות לקבלת מיקום המשתמש שאינן מושפעות מהשינוי הזה, כגון Google Maps Geolocation API, GeoIP (לדוגמה, יש פתרונות אחרים שמבוססים על מיקום גיאוגרפי) ומיקוד שהמשתמש הזין. עם זאת, מומלץ מאוד שהדרך הטובה ביותר להבטיח גישה שוטפת למיקום גיאוגרפי היא לעבור ל-HTTPS.