Electron set cookie

后端 未结 3 1921
终归单人心
终归单人心 2021-01-25 14:11

I am new to electron and converting an web app to desktop application.I am loading pages from file system.Cookies are working if pages are served from web server but when I load

相关标签:
3条回答
  • 2021-01-25 14:39

    Follow the documentation to get it done, and use the standard.https://electronjs.org/docs/api/cookies

      const {session} = require('electron')
    
          // Query all cookies.
          session.defaultSession.cookies.get({}, (error, cookies) => {
            console.log(error, cookies)
          })
    
          // Query all cookies associated with a specific url.
          session.defaultSession.cookies.get({url: 'http://www.github.com'}, (error, cookies) => {
            console.log(error, cookies)
          })
    
          // Set a cookie with the given cookie data;
          // may overwrite equivalent cookies if they exist.
          const cookie = {url: 'http://www.github.com', name: 'dummy_name', value: 'dummy'}
          session.defaultSession.cookies.set(cookie, (error) => {
            if (error) console.error(error)
          })
    
    0 讨论(0)
  • 2021-01-25 14:42

    Well, I want to answer my question in case somebody is having the same problem. I have fixed the cookie problem by registerStandardSchemes. The sample code is as follows and code works for saving cookies from web pages as well:

    protocol.registerStandardSchemes(["app"], {
        secure: true
    });
    

    and on ready event

    protocol.registerFileProtocol('app', (request, callback) => {
        const urls = request.url.substr(6)
        const parsedUrl = url.parse(urls);
        // extract URL path
        const pathname = `.${parsedUrl.pathname}`;
        // based on the URL path, extract the file extention. e.g. .js, .doc, ...
        const ext = path.parse(pathname).ext;
        callback({
           path: path.normalize(`${__dirname}/${parsedUrl.pathname}`)
        })
    }, (error) => {
        if (error) {
            console.error('Failed to register protocol');
        }
    });
    
    0 讨论(0)
  • 2021-01-25 14:56

    OK, I got it working with Electron 5. Below are the relevant bits based on @zahid-nisar's solution, and below that a full sample Electron main.js to show how it all fits together. Obviously, change the location of your app in mainWindow.loadURL('app://www/index.html');.

    Relevant code to insert in main.js:

    const { protocol } = require('electron');
    
    protocol.registerSchemesAsPrivileged([{
        scheme: 'app',
        privileges: {
            standard: true,
            secure: true
        }
    }]);
    

    Inside app.on('ready') function:

    protocol.registerFileProtocol('app', (request, callback) => {
        const url = request.url.substr(6);
        callback({
            path: path.normalize(`${__dirname}/${url}`)
        });
    }, (error) => {
        if (error) console.error('Failed to register protocol');
    });
    

    Then, inside your createWindow function, load your app like this:

    mainWindow.loadURL('app://www/index.html');
    

    And finally, here is a complete sample main.js with the above code (plus extras that I need, like Service Worker):

    // Modules to control application life and create native browser window
    const {
        app,
        protocol,
        BrowserWindow
    } = require('electron');
    const path = require('path');
    
    // This is used to set capabilities of the app: protocol in onready event below
    protocol.registerSchemesAsPrivileged([{
        scheme: 'app',
        privileges: {
            standard: true,
            secure: true,
            allowServiceWorkers: true,
            supportFetchAPI: true
        }
    }]);
    
    // Keep a global reference of the window object, if you don't, the window will
    // be closed automatically when the JavaScript object is garbage collected.
    let mainWindow;
    
    function createWindow() {
        // Create the browser window.
        mainWindow = new BrowserWindow({
            width: 800,
            height: 600
            //, webPreferences: {
            //     preload: path.join(__dirname, 'preload.js')
            // }
        });
    
        // and load the index.html of the app.
        mainWindow.loadURL('app://www/index.html');
        // DEV: Enable code below to check cookies saved by app in console log
        // mainWindow.webContents.on('did-finish-load', function() {
        //     mainWindow.webContents.session.cookies.get({}, (error, cookies) => {
        //       console.log(cookies);
        //     });
        // });
    
        // Open the DevTools.
        // mainWindow.webContents.openDevTools()
    
        // Emitted when the window is closed.
        mainWindow.on('closed', function () {
            // Dereference the window object, usually you would store windows
            // in an array if your app supports multi windows, this is the time
            // when you should delete the corresponding element.
            mainWindow = null;
        });
    }
    
    // This method will be called when Electron has finished
    // initialization and is ready to create browser windows.
    // Some APIs can only be used after this event occurs.
    app.on('ready', () => {
        protocol.registerFileProtocol('app', (request, callback) => {
            const url = request.url.substr(6);
            callback({
                path: path.normalize(`${__dirname}/${url}`)
            });
        }, (error) => {
            if (error) console.error('Failed to register protocol');
        });
        // Create the new window
        createWindow();
    });
    
    // Quit when all windows are closed.
    app.on('window-all-closed', function () {
        // On macOS it is common for applications and their menu bar
        // to stay active until the user quits explicitly with Cmd + Q
        if (process.platform !== 'darwin') app.quit();
    });
    
    app.on('activate', function () {
        // On macOS it's common to re-create a window in the app when the
        // dock icon is clicked and there are no other windows open.
        if (mainWindow === null) createWindow();
    });
    
    // In this file you can include the rest of your app's specific main process
    // code. You can also put them in separate files and require them here.
    
    0 讨论(0)
提交回复
热议问题