Electron保存用户登录状态持久化登录

24次阅读
没有评论

在 ​​Electron​​ 中,默认情况下 ​​不会自动保存 Cookie​​ 或 ​​登录状态​​,这意味着每次重启应用后用户需要重新登录。为了实现 ​​持久化登录​​(如闲鱼网页版的自动登录),我们可以利用 Electron 的 ​session​ 机制来管理 Cookie 和本地存储。以下是完整的实现方案:


​1. 基本原理​

  • session​ 是 Electron 中管理浏览器会话(Cookies、缓存、本地存储)的核心模块。
  • session.defaultSession​ 是默认会话,所有 BrowserWindow 共享。
  • session.fromPartition()​ 可以创建隔离的会话(适合多账户场景)。

​2. 完整代码实现​

​(1) 初始化项目​

npm init -y
npm install electron

​(2) 创建 main.js(完整实现)​

const { app, BrowserWindow, session } = require('electron');
const path = require('path');

let mainWindow;

// 配置持久化会话,需要注意需要在app.whenReady里使用,不然会报错
// App threw an error during load
// TypeError: Session can only be received when app is ready
const persistentSession = session.fromPartition('persist:xianyu', { cache: true });

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
      session: persistentSession, // 使用持久化会话
      partition: 'persist:xianyu' // 关键:确保所有子窗口共享同一会话
    }
  });

  // 加载闲鱼网页
  mainWindow.loadURL('https://www.xianyu.com');

  // 监听登录状态(示例:检查 Cookie)
  checkLoginStatus();

  // 拦截新窗口打开(确保子窗口继承同一会话)
  mainWindow.webContents.setWindowOpenHandler(({ url }) => {
    return {
      action: 'allow',
      overrideBrowserWindowOptions: {
        webPreferences: {
          session: persistentSession, // 子窗口使用相同会话
          partition: 'persist:xianyu'
        }
      }
    };
  });
}

// 检查登录状态(通过 Cookie)
function checkLoginStatus() {
  persistentSession.cookies.get({ url: 'https://www.xianyu.com' })
    .then(cookies => {
      const isLoggedIn = cookies.some(cookie => cookie.name === '登录Cookie名称');
      console.log('用户是否已登录?', isLoggedIn);
    });
}

// 启动应用
app.whenReady().then(() => {
  // 可选:全局忽略证书错误(仅测试环境用)
  session.defaultSession.setCertificateVerifyProc((request, callback) => {
    callback(0); // 强制信任所有证书
  });
  createWindow();
});

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

​3. 关键配置说明​

​(1) 持久化会话​

const persistentSession = session.fromPartition('persist:xianyu', { cache: true });
  • persist:​ 前缀表示会话数据会保存到磁盘(app.getPath('userData') 目录)。
  • cache: true​ 启用缓存,加速后续加载。

​(2) 继承会话的子窗口​

setWindowOpenHandler({
  overrideBrowserWindowOptions: {
    webPreferences: {
      session: persistentSession, // 子窗口共享同一会话
      partition: 'persist:xianyu'
    }
  }
});

确保所有弹出窗口(如登录弹窗)使用相同的会话,避免登录状态丢失。

​(3) 检查登录状态​

persistentSession.cookies.get({ url: 'https://www.xianyu.com' })
  .then(cookies => {
    const isLoggedIn = cookies.some(cookie => cookie.name === '登录Cookie名称');
  });

通过检查关键 Cookie(如 _m_h5_tk)判断用户是否已登录。


​4. 高级优化​

​(1) 手动保存 Cookie(备用方案)​

如果自动保存不生效,可以手动存储并恢复:

// 退出前保存 Cookie
app.on('before-quit', () => {
  persistentSession.cookies.flushStore();
});

// 启动时恢复 Cookie
app.whenReady().then(() => {
  persistentSession.cookies.set({
    url: 'https://www.xianyu.com',
    name: 'Cookie名称',
    value: 'Cookie值',
    expirationDate: new Date().getTime() / 1000 + 3600 * 24 * 30 // 30天后过期
  });
});

​(2) 清除会话数据​

// 退出登录时调用
persistentSession.clearStorageData({
  storages: ['cookies', 'localstorage']
});

​(3) 调试会话​

console.log('会话数据路径:', app.getPath('userData'));
// 输出类似:/Users/用户名/Library/Application Support/YourApp/Partitions/persist_xianyu

​5. 常见问题解决​

​Q1: 登录后重启应用,状态丢失?​

  • 确保所有 BrowserWindow 使用 ​​相同的 partition​。
  • 检查是否有跨域问题(如 www.xianyu.comlogin.xianyu.com 域名不同)。

​Q2: 如何获取闲鱼的关键 Cookie?​

  1. 登录闲鱼网页版后,按 F12 打开开发者工具。
  2. 进入 ​​Application → Cookies​​,找到类似 _m_h5_tk 的 Cookie。

​Q3: 企业级应用如何增强安全性?​

  • 使用 ​​加密存储​​(如 electron-store + crypto-js)。
  • 限制 Cookie 的作用域和有效期。

​总结​

功能 实现方式
​持久化会话​ session.fromPartition('persist:name')
​子窗口共享登录​ setWindowOpenHandler + 覆盖 webPreferences.session
​检查登录状态​ session.cookies.get() 查询关键 Cookie
​手动管理 Cookie​ cookies.set() / cookies.flushStore()

通过上述方法,你的 Electron 应用可以像浏览器一样 ​​保持闲鱼登录状态​​,无需用户重复登录!🚀

正文完
 0
wujingquan
版权声明:本站原创文章,由 wujingquan 于2025-06-05发表,共计3304字。
转载说明:Unless otherwise specified, all articles are published by cc-4.0 protocol. Please indicate the source of reprint.
评论(没有评论)