【问题标题】:getCurrentPosition() and watchPosition() are deprecated on insecure originsgetCurrentPosition() 和 watchPosition() 在不安全的来源上被弃用
【发布时间】:2015-11-13 10:08:58
【问题描述】:

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

getCurrentPosition() 和 watchPosition() 在不安全的来源上被弃用,并且支持将在未来被删除。您应该考虑将应用程序切换到安全源,例如 HTTPS。详情请见goo.gl/rStTGz

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

我没有将我的网站迁移到 SSL 的计划...那么像我这样的人有其他选择吗?

【问题讨论】:

  • 希望他们不会在未来的版本中直接关闭该功能而不进行替换...
  • 他们可能会在未来的版本中关闭该功能而不进行替换。这正是他们现在弃用它的原因。引用我们希望逐步将这些功能迁移到仅安全模式

标签: javascript html geolocation deprecation-warning


【解决方案1】:

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

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

这是 JSFiddles:

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

【讨论】:

  • 嗨,你能发一个例子吗?谢谢
  • 我仍然会收到警告信息,可以吗?
  • 是的,因为 fiddle 仅在浏览器地理定位失败时(当您收到警告时)使用 API。
  • 请注意,该示例使用 JQuery。
  • 此外,Google Maps Geolocation API 并未提及 GPS,而是提及网络接入点(wifi、蜂窝)或 IP 地理信息作为后备。所以现在看来​​ HTTPS 是必不可少的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这应该被标记为正确答案。
    • 魅力十足!
    【解决方案4】:

    是的。 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 非常容易。这里是guide

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

    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 的 GeoLocation API 请求。这是 webkit 更新日志:https://trac.webkit.org/changeset/200686

    【讨论】:

    • 我收到信息:“您正在使用不受支持的命令行标志:--unsafely-treat-insecure-origin-as-secure。稳定性和安全性将受到影响”。 Chrome 版本:50.0.2661.102。地理定位仍然无法正常工作
    • 杀死所有实例并重试。 stackoverflow.com/questions/6918393/…
    • 在 chrome 浏览器中测试您的应用程序时,只需将应用程序 url(通常为 192.xxx.xxx.xxx:3000)更改为 localhost:3000 .. 您需要确保您的媒体政策支持它,但不会出现安全错误。
    【解决方案5】:

    您可以为此使用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"
    }
    

    这是一个示例,它使用与您从getCurrentPosition() 获得的内容相匹配的 API 响应构造一个 coords 对象:

    $.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

    【讨论】:

    • 您的机器或网络上安装了什么防病毒软件?
    【解决方案6】:

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

    【讨论】:

    • 如何让用户这样做?
    • 在 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
    【解决方案7】:

    【讨论】:

      【解决方案8】:

      在 HTTP 中发生错误。

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

      它对我有用。

      【讨论】:

        【解决方案9】:

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

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

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

        【讨论】:

          【解决方案10】:

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

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

          【讨论】:

          • Firefox 64:“地理定位请求只能在安全上下文中完成。”
          • Safari 12: "[blocked] 对地理定位的访问因与0.0.0.0:8060 的不安全连接而被阻止。"
          • Opera 57:“[Deprecation] getCurrentPosition() 和 watchPosition() 不再适用于不安全的来源。要使用此功能,您应该考虑将应用程序切换到安全的来源,例如 HTTPS。”
          【解决方案11】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-26
            • 1970-01-01
            • 2017-10-30
            • 2010-12-29
            • 1970-01-01
            • 2015-09-09
            • 2019-10-19
            相关资源
            最近更新 更多