#javascript #session #cookies #webview #electron
#javascript #сессия #файлы cookie #webview #electron
Вопрос:
Я просмотрел всю доступную информацию по этому вопросу, и документация мне не помогает.
У меня есть приложение Electron (React internals), где веб-страница должна отображаться в webview.
Домен, например, https://root.domain.com
остается тем же, но остальная часть URL будет отличаться в зависимости от реквизитов, переданных компоненту, отображающему webview.
Здесь я нашел некоторый код, связанный с видеороликом 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%"
}}
/>
Я получаю страницу входа в систему.
Итак, я попытался установить файлы cookie в webview, когда он завершит загрузку, а затем перезагрузить:
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 нигде не отображаются (но другие отображаются). Почему это?
Комментарии:
1. Вы разобрались с этим? Вы провели здесь отличное исследование, спасибо, что поделились им со всеми. Я пытаюсь войти в систему в окне / средстве визуализации и использовать его в node-fetch в main.