Как использовать куки, полученные в BrowserWindow в веб-просмотре - PullRequest
1 голос
/ 05 марта 2019

Я искал всю доступную информацию по этому вопросу, и документация мне не помогает.

У меня есть приложение 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 нигде не отображаются (а другие отображаются). Почему это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...