getCurrentPosition() 和 watchPosition() 在不安全的来源上已被弃用。

69

我在我的网站上请求用户的地理位置数据时遇到了这个错误:

getCurrentPosition() 和 watchPosition() 在不安全的源上已被弃用,并且将来将不再支持。您应该考虑将应用程序切换到安全源,例如HTTPS。有关详细信息,请参见goo.gl/rStTGz

我的意思是,这只是一个通知,而谷歌链接只是说它正在被弃用。

我没有计划将我的网站移动到SSL...那么像我这样的人是否有替代方案?


1
希望他们不会在未来的版本中关闭该功能而没有替代方案... - Phung D. An
他们很可能在未来的版本中关闭该功能而不提供替代方案。这正是他们现在将其弃用的原因。引用“我们预计逐步将这些功能迁移到仅安全模式下”。 - MarkJ
11个回答

47

因为根据你的架构,切换到HTTPS可能很麻烦或不可能,我找到了一个解决方法:你可以使用Google Maps Geolocation API。尽管它有使用限制,但它能胜任。你需要一个浏览器API密钥,所以不要忘记将其使用限制为您页面的主机名。

如果getCurrentPosition()方法失败,我将其用作后备方法。 这使我可以让它在我切换到HTTPS之前正常工作。

以下是JSFiddles链接:

  • HTTP: getCurrentPosition()将失败并回退到API
  • HTTPS: getCurrentPosition()将成功

你好,能否请您提供一个例子?谢谢。 - Patrick
2
是的,因为当浏览器地理位置失败时(当出现警告时),这个“小提琴”才会使用 API。 - gogson
1
请注意,此示例使用JQuery。 - handle
2
此外,Google Maps 地理定位 API 并没有提到 GPS,而是使用网络接入点(wifi、蜂窝)或 IP 地理信息作为备选方案。因此,现在 HTTPS 是至关重要的。 - handle
确实,感谢您的精准。由于Chrome的严格政策,我们很快就需要全部切换到HTTPS。越早越好。 - gogson
显示剩余3条评论

24

1
这应该被标记为正确答案。 - obe
1
运行得非常好! - wajdi_jurry
请注意,您还需要将右侧的下拉菜单更改为“启用”状态。这有点令人困惑,因为当您更改字段时,它会自动提示您保存并重新启动Chrome,但它不会自动启用它。我尝试了几次才意识到这一点。 - undefined

21
在 /jstillwell 的贴子中找到了一个可能的答案: https://github.com/stefanocudini/leaflet-gps/issues/15 基本上这个功能将来(仅在 Chrome 中?)不再支持 HTTP 网站,但 HTTPS 仍然可以使用,并且没有计划为 HTTP 使用创建等效替代品。

14

是的,在版本50中,Google Chrome已经弃用了该功能。如果您在chrome中尝试使用它,则会出现以下错误:

getCurrentPosition()和watchPosition()在不安全的源上已被弃用。为使用此功能,您应考虑将应用程序切换到安全来源,例如HTTPS。有关更多详细信息,请参见https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins。

所以,您需要添加SSL证书。这是唯一的方法。

而且现在使用Let's Encrypt相当容易。这里是指南

对于测试目的,您可以尝试以下内容:

1. localhost在HTTP上被视为安全来源,因此如果您能够从localhost运行服务器,则应该能够在该服务器上测试该功能。

2. 您可以使用--unsafely-treat-insecure-origin-as-secure =“http://example.com”标志(将“example.com”替换为实际要测试的来源),这将在此会话中将该来源视为安全。请注意,您还需要包括--user-data-dir=/test/only/profile/dir来创建一个新的测试配置文件,以使标志起作用。

我认为Firefox也限制了用户从http访问GeoLocation API请求。这是WebKit的更新日志:https://trac.webkit.org/changeset/200686


我收到的信息是:"您正在使用不支持的命令行标志:--unsafely-treat-insecure-origin-as-secure。稳定性和安全性将会受到影响"。Chrome 版本:50.0.2661.102。同时,地理位置仍然无法工作。 - instead
杀掉所有实例,然后重试。https://dev59.com/SWw05IYBdhLWcg3w9mhW - Asim K T
当在 Chrome 浏览器中测试您的应用程序时,只需将应用程序的 URL(通常为 192.xxx.xxx.xxx:3000)更改为 localhost:3000。您需要确保媒体策略支持它,但您将不会收到安全错误。 - MindWire

13
您可以使用我的服务 https://ipinfo.io API 来实现这个功能。它免费支持每天最多1000次请求(包括SSL支持和非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"
}

以下是一个示例,该示例使用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以获取更多细节。


你的电脑或网络上安装了什么防病毒软件? - Ben Dowling

8
你可以使用 --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

3
如何让用户这样做? - Marty Kiker
在Mac上:/usr/bin/open -n "/Applications/Google Chrome.app" --args "http://localhost:8100" --unsafely-treat-insecure-origin-as-secure="http://localhost:8100" --user-data-dir=/tmp/testprofile - Hugo

2

0

HTTP 中发生了错误。

在下方的标签中为localhost设置权限(接受这些 HTTP 引用网站的请求)。

对我有效。


0

我知道geoLocation API更好,但对于无法使用SSL的人,您仍然可以使用某些服务,例如geopluginService

根据文档,您只需向服务URL发送带有IP的请求http://www.geoplugin.net/php.gp?ip=xx.xx.xx.xx,输出是一个序列化数组,因此在使用之前必须进行反序列化。

请记住,该服务不如geoLocation准确,但仍然是一种简单快捷的解决方案。


-1

如果您想在开发环境中测试,请使用 FireFox 或其他浏览器,而不是 Chrome。对于生产环境,除了使用 https 之外别无选择。

对于开发环境,只需在 FireFox 中打开 http://localhost:8100/,就不会出现此类错误。


Firefox 64:"地理位置请求只能在安全上下文中完成。" - Hugo
Safari 12:"由于与 http://0.0.0.0:8060 的不安全连接,地理位置访问被阻止。" - Hugo
Opera 57:“[弃用] getCurrentPosition() 和 watchPosition() 不再在不安全的源上工作。要使用此功能,您应该考虑将应用程序切换到安全源,例如HTTPS。” - Hugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接