主机权限的用户控制:转换指南

摘要

有何变化?

从 Chrome 70 开始,用户可以限制扩展程序主机对自定义的网站列表进行访问,也可以将扩展程序配置为需要点击才能访问当前页面。

哪些 API 会受到影响?

此变更会影响受扩展程序清单中指定的主机权限以及内容脚本影响的所有 API。需要主机权限的 API 包括 webRequestCookietabs.executeScript()tabs.insertCSS(),以及执行跨源请求(例如通过 XMLHTTPRequestfetch() API)。

限制访问权限

用户如何限制访问权限?

用户可以选择允许您的扩展程序在用户点击时运行、在一组特定网站上运行,或者在请求的所有网站上运行。这些选项会在 chrome://extensions 页面和扩展程序上下文菜单中呈现给用户。

运行时主机权限的上下文菜单控件的屏幕截图,其中包括在用户点击时、在特定网站或所有网站上运行扩展程序的选项。

如果用户选择“点击”运行我的扩展程序,会出现什么情况?

从本质上讲,该扩展程序的行为方式就像使用了 activeTab 权限。对于用户点击该扩展程序的任何主机(如果相应主机是由该扩展程序请求,且不是受限网站,例如 chrome://settings),系统会向该扩展程序授予临时访问权限。设置为点击运行时,Chrome 会使用圆圈和阴影标记您的扩展程序(见下文),以表明其正在请求访问特定网站。

Chrome 添加到工具栏中扩展程序图标的标记的屏幕截图

如果用户选择在特定网站上运行我的扩展程序,会出现什么情况?

您的扩展程序可在用户选择的任何网站上自动运行,无需用户进一步操作即可访问。在您的扩展程序请求访问但用户未授予权限的其他网站上,该行为与用户已将扩展程序设置为在用户点击时运行一样。

如果用户选择在所有网站上运行我的扩展程序,会发生什么情况?

该扩展程序可以自动访问清单中请求的任何网站。

API 行为

网络请求 API

此扩展程序仍能拦截、修改和屏蔽来自其有权访问的网站的任何请求。对于此扩展程序无权访问的网站,Chrome 会标记该扩展程序,以表明该扩展程序会请求访问相应网页。然后,用户可以授予对该扩展程序的访问权限;Chrome 随后会提示用户刷新页面,以允许您的扩展程序拦截网络请求。

内容脚本、tabs.executeScript()、tabs.insertCSS()

该扩展程序仍能为自己有权访问的任何网站自动注入脚本和样式表。对于此扩展程序无权访问的网站,Chrome 会标记该扩展程序,以表明该扩展程序会请求访问相应网页。然后,用户可以授予对该扩展程序的访问权限。如果内容脚本设置为在 document_idle 注入,该脚本将立即注入。否则,Chrome 会提示用户刷新页面,以允许扩展程序在网页加载的早期(在 document_start 或 document_end 处)注入脚本。仅当用户授予对网站的访问权限时,才会调用 tabs.executeScript()tabs.insertCSS() 方法的回调函数。

Cookie 和后台网页 XHR

该扩展程序仍然可以读取和修改任何来自其有权访问的网站的 Cookie,并对其执行跨源 XHR。由于没有任何标签页与访问其他来源的 Cookie 或对其他主机执行 XHRing 操作的扩展程序页面相关联,因此 Chrome 不会标记该扩展程序,以向用户表明该扩展程序正在请求访问网站。尝试访问其他网站的 Cookie 或进行跨源 XHR 的操作将失败,并返回错误,就像该扩展程序的清单不包含主机权限一样。对于这些情况,我们建议您使用可选权限,以便用户授予对不同网站的运行时访问权限。

以下示例说明了此方法如何适用于 Cookie API。

Before:

{
  ...
  "permissions": ["cookies", "https://example.com"]
}
chrome.cookies.get({url: 'https://example.com', name: 'mycookie'},
                    function(cookie) {
                      // Use the cookie.
                    });

之后:

{
  ...
  "permissions": ["cookies"],
  "optional_permissions": ["https://example.com"]
}
// Note: permissions.request() requires a user gesture, so this
// may only be done in response to a user action.
chrome.permissions.request(
    {origins: ['https://example.com']},
    function(granted) {
      if (granted) {
        chrome.cookies.get({url: 'https://example.com', name: 'mycookie'},
                            function(cookie) {
                              // Use the cookie.
                            });
      } else {
        // Handle grant failure
      }
    });

迁移

有哪些最佳做法可以避免受到负面影响?

扩展程序可以使用可选权限activeTabdeclarativeContent API 来遵循最佳实践。可选权限在运行时授予,并且允许扩展程序请求对某个网站的特定访问权限。activeTab 权限不受影响,使用它的扩展程序会继续正常运行。declarativeContent API 可替代许多向每个网页注入脚本的需求。

我当前用户的设置会怎么样?

此更改不会立即影响您已向扩展程序授予的任何当前权限。也就是说,除非用户采取措施限制允许其访问的网站,否则它将继续一如既往地运行。在未来的版本中,Chrome 将为用户提供更多控件来调整设置。

如何检查我的扩展程序是否有权在网站上运行?

您可以使用 permissions.contains() API 来检查您的扩展程序是否已获得对给定源的访问权限。