Chrome扩展如何在不打开新标签页的情况下访问某个网站的localStorage中的token?
我正在开发一个Chrome扩展,并尝试访问存放在网站的 localStorage 中的登录令牌。
目前,我在 manifest.json 中拥有权限,并实现了一个变通方案:扩展会监听变化,静默打开一个新标签页,然后从该标签页读取令牌。这种做法可行,但效率低下,不太理想,因为不必要地打开了一个新标签页。
我想要的解决方案是:
- 访问活动标签页的
localStorage(或目标网站) - 直接获取身份验证令牌
- 避免打开任何新标签页
我尝试过:
- 使用
chrome.tabs和chrome.scripting - 监听标签页更新
- 在打开新标签页后注入脚本(可行,但并非理想)
我的问题:
- Chrome扩展是否可以在不打开新标签页的情况下,直接访问页面的
localStorage? - 我应该改用内容脚本吗?如果是,如何正确检索并将令牌传回扩展?
- 是否存在任何权限或安全性限制阻止此操作?
附加信息:
- 我已经在
manifest.json配置了主机权限 - 清单版本:V3
任何指导或最佳实践都将不胜感激。
解决方案
在Manifest V3中,几乎不可能在没有DOM上下文(标签页或框架)的情况下,直接从后台脚本(Service Worker)原生读取特定网站的 localStorage。
浏览器严格将 localStorage 限制在页面的源内,遵循同源策略。因此,后台Service Worker没有DOM,无法原生查看网站的 localStorage。
然而,要从Chrome扩展的后台脚本(Service Worker)访问网站的 localStorage,必须在顶级框架中加载该网站。
- 你将需要对目标网站具备
scripting权限和主机访问权限:
{
"permissions":["scripting"],
"host_permissions": ["*://yourwebsite.com/*"]
}
- 使用这段异步函数来无缝获取令牌(
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。