为什么我在localhost上的Chrome中遇到了getCurrentPosition()和watchPosition()“不安全的起源”错误?

时间:2017-05-30 03:23:20

标签: javascript google-chrome geolocation google-geolocation

我正在本地开发环境(Ubuntu 16.04)上的一个网站上工作,并通过http://localhost.example/在Chrome(58)上测试网站,该网站连接到本地网络服务器。

运行此Javascript:

$(document).ready(function() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    }
});

触发此错误:

  

[Deprecation] getCurrentPosition()和watchPosition()不再有效   在不安全的起源。要使用此功能,您应该考虑   将您的应用程序切换到安全的来源,例如HTTPS。看到   https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins了解更多详情。

为什么?据我所知,面向公众的网站需要运行HTTPS才能使地理位置库/功能正常运行。我们有许多公共网站在HTTPS上运行类似的代码。

但是根据depreciation documentation

  

localhost被视为HTTP上的安全源,所以如果你能够   要从localhost运行您的服务器,您应该能够测试   该服务器上的功能。

以上Javascript在通过http://localhost.example/test-page/加载的HTML正文中内嵌运行 - 为什么我在Chrome中收到“不安全的来源”错误?

Firefox(53)按预期显示浏览器访问位置提示。

2 个答案:

答案 0 :(得分:4)

Chrome将localhost over http视为安全。当您在http上使用hostnme localhost.example时,这不被视为安全。

注意:Firefox的行为与Firefox 55相似

答案 1 :(得分:0)

SSL over HTTP协议可确保客户端和服务器之间的专用通信。信息可能在传输时通过专用网络传输。网络上的任何第三方(黑客)都可以窃取该信息。为避免该浏览器强制用户使用安全连接。

在本地服务器上,信息不会超出我们的私有本地网络,因为不需要这种安全性。因此,我们可以期望浏览器允许在本地服务器上没有SSL的地理位置。理想情况下,浏览器开发人员应跳过localhost和127.0.0.1或类似来源的验证。

必须有一些技巧可以避免此类问题,即您可以在本地服务器上安装自签名SSL证书,或者您可以编辑Chrome配置文件以允许域访问地理位置,网络摄像头等。

有用的链接,

https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins

https://ngrok.com/