在不安全的起源

时间:2015-08-19 22:46:12

标签: javascript html5 geolocation deprecation-warning

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

  

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

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

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

11 个答案:

答案 0 :(得分:40)

根据您的体系结构,切换到HTTPS可能会很痛苦或不可能, 我找到了一种解决方法:您可以使用Google Maps Geolocation API。虽然它有使用限制,但它可以完成这项工作。您将需要一个浏览器API密钥,因此不要忘记将其使用限制在您的页面主机名。

如果它失败,我将它用作getCurrentPosition()方法的回退方法。它允许我使其工作,直到我切换到HTTPS。

这是JSFiddles:

  • HTTPgetCurrentPosition()将失败并退回API
  • HTTPSgetCurrentPosition()将成功

答案 1 :(得分:15)

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

答案 2 :(得分:14)

是。谷歌浏览器已弃用版本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非常容易。这是guide

为了测试目的,你可以试试这个:

  

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

答案 3 :(得分:11)

您可以使用https://ipinfo.io API(这是我的服务)。它可以免费获得高达1,000 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"
}

这是一个使用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

答案 4 :(得分:4)

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

答案 5 :(得分:1)

这仅用于测试,您可以在Google chrome中进行测试: 导航至:chrome://flags/#unsafely-treat-insecure-origin-as-secure 然后您会看到: enter image description here 输入您要允许的地址,然后启用重新启动您的浏览器。

答案 6 :(得分:0)

在HTTP中发生错误。

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

它对我有用。

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

仅对于开发人员,您可以授权特定的本地域使用此功能:

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

答案 9 :(得分:-1)

如果要在开发环境中对其进行测试,请使用FireFox或任何其他浏览器而不是Chrome,除了使用https之外,无法进行生产。

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

答案 10 :(得分:-3)

花一些时间安装SSL证书getCurrentPosition(),而watchPosition()不再适用于不安全的来源。要使用此功能,您应该考虑将应用程序切换到安全的来源,例如HTTPS。