65

我在向用户请求地理位置数据的网站上收到此错误:

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

我的意思是它基本上只是一个通知,而谷歌链接只是说它已被弃用。

我没有将我的网站迁移到 SSL 的计划……那么像我这样的人有替代方案吗?

4

11 回答 11

47

因为根据您的架构切换到 HTTPS 可能会很痛苦或不可能,所以我找到了一个解决方案:您可以使用Google Maps Geolocation API。尽管它有使用限制,但它可以完成工作。您将需要一个浏览器 API 密钥,因此不要忘记将其使用限制为您的页面主机名。

getCurrentPosition()如果它失败,我将它用作该方法的后备方法。它允许我让它工作,直到我切换到 HTTPS。

这是JSFiddles:

  • HTTPgetCurrentPosition()将失败并回退到 API
  • HTTPSgetCurrentPosition()会成功
于 2016-05-17T12:34:25.577 回答
21

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

于 2015-08-20T17:37:20.747 回答
17

它仅用于测试,您可以在 google chrome 中进行操作:导航到:chrome://flags/#unsafely-treat-insecure-origin-as-secure 然后您将看到: 在此处输入图像描述 输入您要允许的地址,然后启用重新启动您的浏览器。

于 2019-11-01T19:22:30.883 回答
14

是的。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's Encrypt非常容易。这是指南

出于测试目的,您可以尝试以下操作:

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

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

我认为 Firefox 还限制用户从http. 这是 webkit 更改日志:https ://trac.webkit.org/changeset/200686

于 2016-05-11T11:50:10.137 回答
13

您可以为此使用https://ipinfo.io API(这是我的服务)。每天最多 1,000 个请求是免费的(有或没有 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 响应构造一个 coords 对象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

于 2016-09-23T17:33:00.837 回答
7

您可以使用 --unsafely-treat-insecure-origin-as-secure="http://example.com" 标志运行 chrome(将“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
于 2016-06-02T11:09:47.730 回答
2

仅限开发者,您可以授权特定的本地域使用此功能:

https://medium.com/@Carmichaelize/enabling-the-microphone-camera-in-chrome-for-local-unsecure-origins-9c90c3149339

于 2019-06-22T18:35:16.007 回答
0

在 HTTP 中发生错误。

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

它对我有用。

于 2016-06-10T09:10:21.247 回答
0

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

如文档中所述,您只需将带有 ip 的请求发送到服务 url http://www.geoplugin.net/php.gp?ip=xx.xx.xx.xx,输出是一个序列化数组,因此您必须在使用它之前对其进行反序列化。

请记住,此服务不像 geoLocation 那样非常准确,但它仍然是一种简单快捷的解决方案。

于 2016-09-14T07:57:36.480 回答
-1

如果您想在开发环境中测试它,请使用FireFox或任何其他浏览器代替,对于生产,除了使用.Chromehttps

对于开发环境,只需http://localhost:8100/在 FireFox 上打开,唉,没有这样的错误。

于 2016-08-29T09:03:20.643 回答
-3

给一些时间来安装 SSL 证书getCurrentPosition()并且watchPosition()不再在不安全的来源上工作。要使用此功能,您应该考虑将应用程序切换到安全源,例如 HTTPS。

于 2016-09-08T03:23:58.780 回答