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
, вывод представляет собой сериализованный массив, поэтому вам необходимо его неэтериализовать перед его использованием.
Помните, что эта услуга не очень точная, как геолокация, но она по-прежнему является простым и быстрым решением.
Ответ 8
Только для разработчиков вы можете авторизовать определенные локальные домены для использования этих функций:
https://medium.com/@Carmichaelize/enabling-the-microphone-camera-in-chrome-for-local-unsecure-origins-9c90c3149339
Ответ 9
Используйте FireFox
или любой другой браузер вместо Chrome
, если вы хотите протестировать его в своей среде разработки, для производства нет способа, кроме использования https
.
Для среды разработки просто откройте http://localhost:8100/
в FireFox и, увы, такой ошибки не будет.
Ответ 10
Дайте некоторое время для установки SSL-сертификата getCurrentPosition()
и watchPosition()
больше не работают с небезопасным происхождением. Чтобы использовать эту функцию, вам следует переключить приложение в безопасное происхождение, например HTTPS.