Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 电子、上下文隔离和上下文桥_Javascript_Security_Electron - Fatal编程技术网

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选择一个更具描述性的名称