我已搜索了所有可用信息,但文档对我没有帮助。
我有一个Electron应用(React内部组件),其中的网页将显示在webview中。
域,例如https://root.domain.com
保持不变,但URL的其余部分会有所不同,具体取决于传递给显示网络视图的组件的道具。
我在测试过程中发现了与here的Youtube视频链接的一些代码BuildingXwithJS,该代码将使用BrowserWindow允许用户登录,然后保存经过身份验证的cookie以在应用程序中使用。
auth() {
const remote = electron.remote;
// Get a partitioned session to use with webview
const ses = remote.session.fromPartition("myPartition");
// create new electron browser window
const BrowserWindow = remote.BrowserWindow;
let win = new BrowserWindow({width: 800, height: 600});
// cleanup on close
win.on('closed', () => {
win = null;
});
// wait for page to finish loading
win.webContents.on('did-finish-load', () => {
// if auth was succesful
if (win.webContents.getURL() === 'https://root.domain.com/Home/') {
// get all cookies
win.webContents.session.cookies.get({}, async (error, cookies) => {
if (error) {
console.error('Error getting cookies:', error);
return;
}
// store cookies
cookies.forEach(c => {
if(c.domain.includes('root.domain.com')){
ses.cookies.set(c,(e) => e? console.log("Failed: %s",e.message):null})
}
// close window
win.close();
});
}
});
// Load login page
win.loadURL(loginURL);
}
现在,当我在Webview中以这样的单独组件查看页面时:
<webview
ref={a => (this.view = a)}
partition="myPartition"
src={`https://root.domain.com/${providedURL}`}
style={{
display: "flex",
width: "100%",
height: "100%"
}}
/>
我得到登录页面。
因此,我尝试按照以下步骤在webview上完成加载后设置cookie,然后重新加载:
this.view.addEventListener("did-finish-load", e => {
// Get partitioned session
const ses = remote.session.fromPartition("myPartition");
// Loop through cookies and add them to the webview
ses.cookies.get({}, (error, cookies) => {
cookies.forEach(cookie => {
// this.view doesn't return the webview in here so I use the event
e.target.getWebContents().session.cookies.set(cookie,(e)=> e? console.log(e):null);
});
// Reload with cookies
e.target.getWebContents().reload();
});
this.setState({ loading: false, failure: false });
});
但是仍然每次我都会获得登录页面!
令人沮丧的是,上面定义的auth()
函数(在另一个包装器组件中)在用户登录一次后每次运行时都会显示一个登录屏幕,因此登录会话处于活动状态并且cookie是存放在某个地方-但是在哪里?以及如何使该Webview可见?使用Iframe会更好吗?对我的涉众来说,我必须要显示一个外部url内联,所以我需要某种方法来使其起作用。
我远不擅长Cookie管理,因此我在Electron中不清楚会话管理,因为有多种访问会话BrowserWindow.webContents().session
或BrowserWindow.webContents().defaultSession
或
import { session } from "electron"
。
此外,当我在devtools中查看“应用程序”选项卡时,这些特定的cookie不会在任何地方显示(但其他地方会显示)。为什么会这样?