Chrome扩展如何在不打开新标签页的情况下访问某个网站的localStorage中的token?

前端开发 2026-07-09

我正在开发一个Chrome扩展,并尝试访问存放在网站的 localStorage 中的登录令牌。

目前,我在 manifest.json 中拥有权限,并实现了一个变通方案:扩展会监听变化,静默打开一个新标签页,然后从该标签页读取令牌。这种做法可行,但效率低下,不太理想,因为不必要地打开了一个新标签页。

我想要的解决方案是:

  • 访问活动标签页的 localStorage(或目标网站)
  • 直接获取身份验证令牌
  • 避免打开任何新标签页

我尝试过:

  • 使用 chrome.tabschrome.scripting
  • 监听标签页更新
  • 在打开新标签页后注入脚本(可行,但并非理想)

我的问题:

  1. Chrome扩展是否可以在不打开新标签页的情况下,直接访问页面的 localStorage
  2. 我应该改用内容脚本吗?如果是,如何正确检索并将令牌传回扩展?
  3. 是否存在任何权限或安全性限制阻止此操作?

附加信息:

  • 我已经在 manifest.json 配置了主机权限
  • 清单版本:V3

任何指导或最佳实践都将不胜感激。

解决方案

在Manifest V3中,几乎不可能在没有DOM上下文(标签页或框架)的情况下,直接从后台脚本(Service Worker)原生读取特定网站的 localStorage

浏览器严格将 localStorage 限制在页面的源内,遵循同源策略。因此,后台Service Worker没有DOM,无法原生查看网站的 localStorage

然而,要从Chrome扩展的后台脚本(Service Worker)访问网站的 localStorage,必须在顶级框架中加载该网站。

  1. 你将需要对目标网站具备 scripting 权限和主机访问权限:
{
  "permissions":["scripting"],
  "host_permissions": ["*://yourwebsite.com/*"]
}
  1. 使用这段异步函数来无缝获取令牌(background.js):
async function getLocalStorageToken() {
  // Create a fully minimized, unfocused background window
  const win = await chrome.windows.create({
    url: 'https://yourwebsite.com',
    state: 'minimized',
    focused: false
  });

  const tabId = win.tabs[0].id;

  try {
    // Wait for the page to fully load
    await new Promise((resolve) => {
      chrome.tabs.onUpdated.addListener(function listener(tId, changeInfo) {
        if (tId === tabId && changeInfo.status === 'complete') {
          chrome.tabs.onUpdated.removeListener(listener);
          resolve();
        }
      });
    });

    // Inject a script to read the true top-level localStorage
    const [{ result }] = await chrome.scripting.executeScript({
      target: { tabId },
      func: () => {
        // Replace 'TOKEN' with the actual key you are targeting
        return window.localStorage.getItem('TOKEN');
      }
    });

    console.log("Successfully retrieved token:", result);
    return result;

  } catch (error) {
    console.error("Failed to read localStorage:", error);
    return null;
  } finally {
    // Guarantee the invisible window is closed instantly, even if errors occur
    if (win.id) {
      await chrome.windows.remove(win.id);
    }
  }
}

// Example usage:
// getLocalStorageToken().then(token => { /* Use your token */ });
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章