如何使用在webview的BrowserWindow中获得的cookie

时间:2019-03-05 10:39:05

标签: javascript session cookies webview electron

我已搜索了所有可用信息,但文档对我没有帮助。

我有一个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().sessionBrowserWindow.webContents().defaultSessionimport { session } from "electron"

此外,当我在devtools中查看“应用程序”选项卡时,这些特定的cookie不会在任何地方显示(但其他地方会显示)。为什么会这样?

0 个答案:

没有答案