Javascript 电子、上下文隔离和上下文桥
我最近不得不修改一个旧的电子应用程序。我发现它的Javascript 电子、上下文隔离和上下文桥,javascript,security,electron,Javascript,Security,Electron,我最近不得不修改一个旧的电子应用程序。我发现它的contextIsolation设置为false,所以我继续将其设置为true(顺便说一句,将nodeIntegration设置为false) 正如所料,它中断了ipc通信 因此,正如许多地方建议的那样,我使用了一个预加载脚本来启用一些通信通道 这是我的preload.js: const{ contextBridge, IPC渲染器 }=要求(“电子”); contextBridge.exposeInMainWorld( “api”{ 发送:(频道
contextIsolation
设置为false
,所以我继续将其设置为true
(顺便说一句,将nodeIntegration
设置为false
)
正如所料,它中断了ipc通信
因此,正如许多地方建议的那样,我使用了一个预加载脚本来启用一些通信通道
这是我的preload.js
:
const{
contextBridge,
IPC渲染器
}=要求(“电子”);
contextBridge.exposeInMainWorld(
“api”{
发送:(频道、数据)=>{
console.log(“在通道上发送”+通道)
//白名单频道
设validChannel=[];
if(有效通道包括(通道)){
发送(通道、数据);
}
},
接收:(频道,函数)=>{
console.log(“在通道上接收”+通道)
设有效通道=[
“设置身份验证令牌”,
“设置窗口名”,
“获取窗口名”,
“将消息发送到一个驱动器”,
“更新徽章”,
“是隐藏的”,
“打开谷歌登录”
];
if(有效通道包括(通道)){
//故意剥离事件,因为它包含“发件人”`
on(channel,(event,…args)=>func(…args));
}
}
}
);
我的问题是“api”参数,我不知道在那里放什么
知道该应用程序加载的网站通过以下方式发送消息:
let electron=false;
如果(窗口中的“需要”){
电子=窗口。要求('electron');
}
const isAppDesktop=!!电子;
const DesktopHelper={
isAppDesktop(){
返回isAppDesktop;
},
UpdateEdge(badgeCount){
返回isAppDesktop?electron.ipcRenderer.send('update-badge',badgeCount):未定义;
},
setAuthToken(令牌){
返回electron.ipcRenderer.send('set-auth-token',token');
},
伊希登(){
返回isAppDesktop?electron.ipcRenderer.sendSync('is-hidden'):未定义;
},
};
导出默认桌面助手;
有人能帮忙吗?
contextBridge.exposeInMainWorld(apiKey,api)
-apiKey参数是将作为窗口[apiKey]
公开的对象的名称
在您的示例中,apiKey
被设置为字符串“api”
,因此公开的方法在窗口.api
对象中可用。您可以通过window.api.send
和window.api.receive
访问它们
DesktopHelper
中的方法应如下所示:
updateEdge(徽章计数){
返回isAppDesktop?window.api.send('update-badge',badgeCount):
未定义;
},
或者干脆api.send('update-badge',badgeCount)
,因为窗口是全局窗口。显然,您可能希望为API选择一个更具描述性的名称