Geolocation API 从 Chrome 50 中的不安全来源中移除了

Chrome 公开表示,将在非安全来源上弃用地理定位等强大功能,我们希望其他浏览器也能效仿。

从 Chrome 50 开始,Chrome 不再支持通过非安全连接传送的网页使用 HTML5 Geolocation API 获取用户的位置信息。这意味着,发出 Geolocation API 调用的网页必须从安全环境(例如 HTTPS)中提供。

这是一个重要问题,因为它会直接影响需要使用地理位置 API 且未通过 https 提供服务的所有网站,但我们相信这项变更对网络上的所有用户都有益。本文应该有助于您了解原因以及后续步骤。

此项更改何时生效?

自 Chrome 50 起(2016 年 4 月 20 日美国太平洋标准时间中午 12 点),此变更即生效。

从版本 44(发布时间:2015 年 7 月 21 日)开始,Chrome 的开发者工具控制台就一直在提供警告。
我们已发布多条公开公告,说明了我们做出这项更改的原因(及相关讨论):

还有许多其他来源也强调了这一点:Mobiforge(2016 年 1 月 26 日)、Wired(2016 年 3 月 17 日)、VentureBeat(2016 年 4 月 13 日)。

为什么要进行此变更?

位置信息属于敏感数据!为了保护用户位置数据的隐私,必须要求使用 HTTPS。如果用户的位置信息可从不安全的情境中获取,网络上的攻击者将能够知道该用户的位置。这会严重侵犯用户隐私。

此更改会影响哪些人?

这会影响目前通过 HTTP(不安全)传送的网页中使用 Geolocation API 的所有网页。如果使用 Geolocation API 的 HTTPS iframe 嵌入在 HTTP 网页中,也会受到影响。(您将无法使用共享的 HTTPS 传送的框架进行 polyfill。)

我的整个 Web 应用都需要使用 HTTPS 吗?

您无需通过 HTTPS 提供整个应用即可使用地理定位功能,只有使用地理定位功能的网页需要在安全环境中提供。目前,安全上下文是指在 HTTPS 或 localhost 的顶级位置托管的任何内容。例如,如果某个 iframe 指向安全的起点,但托管在非安全的起点 (http ://paul.kinlan.me/) 上,则不允许该 iframe 调用地理定位 API。

我们强烈建议您迁移到 HTTPS,因为强大的新版和现有浏览器功能需要安全的来源

这会影响本地开发吗?

不应该,规范中已将 localhost 声明为“可能安全”,在我们的示例中,通过 localhost 在顶级提供的地理定位请求仍会有效。

我可以在运行时检测地理位置信息是否因不在安全上下文中而被屏蔽

可以。地理定位规范定义了一个 PositionError 对象,该对象会传递给地理定位 API 的失败回调。该对象定义了 codemessage 属性。

由于此安全上下文问题而导致的错误将返回 code 1,即“权限被拒绝错误”。如果用户拒绝授予访问权限,或者系统拒绝授予对用户位置信息的访问权限,您可能会收到此错误。这意味着您必须查看消息,才能了解确切原因。

这可能非常脆弱,因为它将来可能会发生变化,但如果看到字符串“Only secure origins are allowed”(仅允许安全来源),则很可能是不安全的内容问题。

navigator.geolocation.getCurrentPosition(success => {
    /* Do some magic. */
}, failure => {
    if (failure.message.startsWith("Only secure origins are allowed")) {
    // Secure Origin issue.
    }
});

请注意,您不能仅检查网页的来源,因为您的网页可能使用的是 https,但位于托管在不安全环境中的 iframe 中。

我真的需要使用地理定位功能;该怎么办?

如果您想使用 HTML5 Geolocation API,或者您的网站已在使用 Geolocation API,请将发出 Geolocation API 调用的网页迁移到 HTTPS,确保这些网页在安全环境中使用。

您可以使用多种回退选项来获取用户的位置信息,这些选项不会受到此变更的影响,例如 Google Maps Geolocation APIGeoIP(例如,还有其他基于地理位置的解决方案)和用户输入的邮政编码。不过,我们强烈建议,为了确保持续访问地理位置信息,最好改用 HTTPS。