Я искал всю доступную информацию по этому вопросу, и документация мне не помогает.
У меня есть приложение Electron (React внутренности), где веб-страница должна отображаться в веб-просмотре .
Домен, например https://root.domain.com
остается прежним, но остальная часть URL будет отличаться в зависимости от реквизитов, передаваемых компоненту, показывающему веб-просмотр.
Я нашел некоторый код здесь , связанный с видео 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
ref={a => (this.view = a)}
partition="myPartition"
src={`https://root.domain.com/${providedURL}`}
style={{
display: "flex",
width: "100%",
height: "100%"
}}
/>
Я получаю страницу входа.
Итак, я попытался выполнить следующие действия, чтобы установить файлы 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. - но где? И как я могу заставить это веб-представление видеть это? Буду ли я лучше с Iframe? Мое требование показывать внешний URL-адрес в строке обязательно для моих заинтересованных сторон, поэтому мне нужен какой-то способ заставить его работать.
Я далеко не опытен в управлении cookie-файлами, и управление сессиями мне неясно в Electron, потому что есть несколько способов доступа к сеансам BrowserWindow.webContents().session
или BrowserWindow.webContents().defaultSession
или
import { session } from "electron"
.
Кроме того, когда я смотрю на вкладку приложения в devtools, эти конкретные файлы cookie нигде не отображаются (а другие отображаются). Почему это?