GetCurrentPosition() и watchPosition() устарели при ненадежном происхождении

Я получаю эту ошибку на своем веб-сайте, которая запрашивает данные Geolocation у пользователя:

getCurrentPosition() и watchPosition() устарели на ненадежном происхождении, и поддержка будет удалена в будущем. Вы должны рассмотреть возможность переключения приложения на безопасное происхождение, например HTTPS. См. Goo.gl/rStTGz для получения более подробной информации.

Я имею в виду его в основном просто уведомление, а ссылка google просто говорит, что его устарело.

У меня нет планов по переносу моего сайта на SSL... так есть альтернатива для кого-то вроде меня?

Ответ 1

Нашел вероятный ответ в сообщениях /jstillwell здесь: https://github.com/stefanocudini/leaflet-gps/issues/15 в основном эта функция не будет поддерживаться (в Chrome только?) в будущем, но только для сайтов HTTP. HTTPS все равно будет в порядке, и нет никаких планов по созданию эквивалентной замены для использования HTTP.

Ответ 2

Поскольку переключение на HTTPS может быть болезненным или невозможным в зависимости от вашей архитектуры, Я нашел обходное решение: вы можете использовать API геолокации Google Maps. Хотя он имеет ограничения на использование, он выполняет эту работу. Вам понадобится ключ API браузера, поэтому не забудьте ограничить его использование вашим именем страницы.

Я использую его как метод возврата к методу getCurrentPosition(), если он терпит неудачу. Это позволяет мне работать, пока я не перейду на HTTPS.

Здесь JSFiddles:

  • HTTP: getCurrentPosition() завершится с ошибкой и вернется к API
  • HTTPS: getCurrentPosition() будет успешным

Ответ 3

Да. Google Chrome отказался от этой функции в версии 50. Если вы попытались использовать ее в chrome, ошибка:

getCurrentPosition() and watchPosition() are deprecated on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins for more details.

Итак, вы должны добавить сертификат SSL. Ну, это единственный способ.

И теперь довольно легко использовать Let encrypt. Здесь руководство

И для целей тестирования вы можете попробовать следующее:

1.localhost рассматривается как безопасное начало по HTTP, поэтому, если вы можете запустить свой сервер с локального хоста, вы должны проверить его на этом сервере.

2. Вы можете запустить хром с флагом -unsafely-treat-insecure-origin-as-secure = "http://example.com" (заменив "example.com" исходным кодом, которое вы действительно хотите проверить), который будет считать это происхождение безопасным для этой сессии. Обратите внимание, что вам также необходимо включить -user-data-dir =/test/only/profile/dir, чтобы создать новый тестовый профиль для работы флага.

Я думаю, Firefox также запретил пользователю получать доступ к запросам API GeoLocation от http. Здесь webkit changelog: https://trac.webkit.org/changeset/200686

Ответ 4

Вы можете использовать API https://ipinfo.io для этого (это мой сервис). Он бесплатный до 1000 req/day (с поддержкой SSL или без нее). Он дает вам координаты, имя и многое другое. Вот пример:

curl ipinfo.io
{
  "ip": "172.56.39.47",
  "hostname": "No Hostname",
  "city": "Oakland",
  "region": "California",
  "country": "US",
  "loc": "37.7350,-122.2088",
  "org": "AS21928 T-Mobile USA, Inc.",
  "postal": "94621"
}

Вот пример, который создает объект coords с ответом API, который соответствует тому, что вы получаете от getCurrentPosition():

$.getJSON('https://ipinfo.io/geo', function(response) { 
    var loc = response.loc.split(',');
    var coords = {
        latitude: loc[0],
        longitude: loc[1]
    };
});

И вот подробный пример, показывающий, как вы можете использовать его как резерв для getCurrentPosition():

function do_something(coords) {
    // Do something with the coords here
}

navigator.geolocation.getCurrentPosition(function(position) { 
    do_something(position.coords);
    },
    function(failure) {
        $.getJSON('https://ipinfo.io/geo', function(response) { 
        var loc = response.loc.split(',');
        var coords = {
            latitude: loc[0],
            longitude: loc[1]
        };
        do_something(coords);
        });  
    };
});

Подробнее см. http://ipinfo.io/developers/replacing-navigator-geolocation-getcurrentposition.

Ответ 5

Вы можете запустить хром с флагом --unsafely-treat-insecure-origin-as-secure = "http://example.com" (заменив example.com на то, что вы действительно хотите проверить) который будет считать это происхождение безопасным для этой сессии. Обратите внимание, что вам также необходимо включить -user-data-dir =/test/only/profile/dir, чтобы создать новый тестовый профиль для работы флага.

Например если вы используете Windows, нажмите "Пуск" и запустите.

chrome --unsafely-treat-insecure-origin-as-secure="http://localhost:8100"  --user-data-dir=C:\testprofile

Ответ 6

В HTTP возникает ошибка.

Задайте разрешение для localhost нижеуказанной метки (Примите запросы от этих HTTP-рефереров (веб-сайтов)).

Это сработало для меня.

Ответ 7

Я знаю, что geoLocation API лучше, но для людей, которые не могут использовать SSL, вы все равно можете использовать какие-то службы, такие как geeluginService.

как указано в документации, вы просто отправляете запрос с ip на служебный url http://www.geoplugin.net/php.gp?ip=xx.xx.xx.xx, вывод представляет собой сериализованный массив, поэтому вам необходимо его неэтериализовать перед его использованием.

Помните, что эта услуга не очень точная, как геолокация, но она по-прежнему является простым и быстрым решением.

Ответ 9

Используйте FireFox или любой другой браузер вместо Chrome, если вы хотите протестировать его в своей среде разработки, для производства нет способа, кроме использования https.

Для среды разработки просто откройте http://localhost:8100/ в FireFox и, увы, такой ошибки не будет.

Ответ 10

Дайте некоторое время для установки SSL-сертификата getCurrentPosition() и watchPosition() больше не работают с небезопасным происхождением. Чтобы использовать эту функцию, вам следует переключить приложение в безопасное происхождение, например HTTPS.