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

摘要

有何变化?

从 Chrome 70 开始,用户可以将扩展程序主机的访问权限限制为 网站,或将扩展程序配置为需要点击才能获得当前网页的访问权限。

哪些 API 会受到影响?

这一变更会影响受扩展程序的 以及内容脚本。需要主机权限的 API 包括 webRequestCookietabs.executeScript()tabs.insertCSS(),并执行跨源访问 请求,例如通过 XMLHTTPRequestfetch() API。

限制访问权限

用户如何限制访问权限?

用户可以选择允许您的扩展程序在被点击时运行、在一组特定的网站上运行,或在所有网页上运行 请求的网站。这些选项会在 chrome://extensions 页面以及 。

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

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

实际上,此扩展程序的行为类似于使用了 activeTab 权限。扩展名为 授予对用户点击扩展程序所在的任何主机的临时访问权限(如果该主机是 扩展程序(并非受限网站,例如 chrome://settings)。如果设置为在用户点击时运行 Chrome 会用圆圈和阴影来标记您的扩展程序(见下文),以表明 请求访问特定网站的权限。

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

如果用户选择在特定网站上运行我的扩展程序,会怎么样?

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

如果用户选择在所有网站上运行我的扩展程序,会怎样?

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

API 行为

网络请求 API

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

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

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

Cookie 和后台网页 XHR

此扩展程序仍然可以读取和修改来自其网站的任何 Cookie,并对其执行跨源 XHR 访问权限。因为没有与访问其他源站的扩展程序页面相关联的标签页 Cookie 或 XHR 时,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 检查 获得对指定源的访问权限