Desktop onboarding loops back to login after successful LobeHub Cloud authorization

用户使用 LobeHub Desktop(Electron 桌面端)v2.2.4 在 macOS 上完成了 LobeHub Cloud 授权,流程如下: - 在桌面端启动登录流程。 - 在浏览器中完成 LobeHub Cloud 授权,浏览器显示“Authorization Successful”。

Desktop onboarding loops back to login after successful LobeHub Cloud authorization

Desktop onboarding loops back to login after successful LobeHub Cloud authorization

快速结论:该报错发生在 LobeHub Desktop v2.2.4(macOS)完成 LobeHub Cloud 授权并点击“Start using”进入主页后,重启应用时回到登录引导页面,形成授权循环。优先检查 lobechat:desktop:onboarding:screen:v1 是否在 localStorage 中被错误地写入为 "login",这可能是由渲染进程中的状态持久化竞态条件导致的。

问题场景

用户使用 LobeHub Desktop(Electron 桌面端)v2.2.4 在 macOS 上完成了 LobeHub Cloud 授权,流程如下:
– 在桌面端启动登录流程。
– 在浏览器中完成 LobeHub Cloud 授权,浏览器显示“Authorization Successful”。
– 桌面端显示授权成功的账户信息和“Start using”按钮。
– 点击“Start using”后,应用短暂进入主页。
– 退出并重新打开 LobeHub Desktop,应用又回到 app://renderer/desktop-onboarding?screen=login 路由,UI 仍显示“Authorization Successful”和“Start using”按钮,形成循环。
该问题仅在使用 LobeHub Cloud 同步存储模式时复现。

报错原文

app://renderer/desktop-onboarding?screen=login

重启后应用被重定向到该页面,且 localStorage 中键 lobechat:desktop:onboarding:screen:v1 的值持续为 "login"

原因分析

可能原因:这是一个由双层面问题导致的循环 bug,根源在于桌面端入门(onboarding)状态机的存储不一致:

  • 渲染进程竞态条件:goToNextStep 函数中,当用户点击“Start using”时,会先调用 clearDesktopOnboardingScreen() 清理保存的屏幕状态(同步),然后通过 window.location.replace('/') 导航到主页。然而,这个导航包裹在一个异步 .finally() 调用(用于 electronSystemService.setWindowMinimumSize(...))内部。在异步调用完成之前,React 可能会因为状态更新触发 useEffect,从而将当前的 currentScreen(仍为 "login")重新写回 localStorage,导致清理失败。
  • 路由重定向循环:当应用重启时,主进程会根据 remoteServerConfigCtr.isRemoteServerConfigured() 正确加载 /,而不是 /desktop-onboarding。但由于 localStorage 中 lobechat:desktop:onboarding:screen:v1 = "login" 未被清理干净,渲染进程中的路由守卫或 OIDC 自动登录组件会将用户重定向回 /desktop-onboarding?screen=login,从而进入循环。

环境排查

  • LobeHub Desktop 版本:2.2.4(macOS)
  • 存储模式:LobeHub Cloud sync
  • 本地配置文件 lobehub-settings.json 应包含:
    • "dataSyncConfig.active": true
    • "dataSyncConfig.storageMode": "cloud"
    • "hasEncryptedTokens": true
    • "hasAccessToken": true
    • "hasRefreshToken": true
  • 可以检查 localStorage 中 lobechat:desktop:onboarding:screen:v1 的值是否为 "login"

解决步骤

  1. 优先尝试临时手动清理 localStorage:在完成授权并进入首页后,通过 LobeHub Desktop 的开发者工具(或直接操作)删除 localStorage 中的 lobechat:desktop:onboarding:screen:v1 键。但注意,此方法不能持久解决问题,重启后可能再次复现。
  2. 确认问题是否为已知 bug:该问题在 v2.2.4 中被报告为应用侧的路由/状态 bug,而非用户数据损坏。请查看 Issue #14820(相关登录会话持久性问题)以获取后续修复进展。
  3. 等待官方修复:社区开发者提出的修复方向是在 goToNextStep 中使用一个 ref(如 completingRef.current = true)来标记正在完成,并在持久化 useEffect 中跳过写入(具体见下)。请关注 LobeHub Desktop 的 canary 或后续版本更新。修复建议为:
// goToNextStep 中,在异步调用前设置 ref 并清理屏幕:
completingRef.current = true;
clearDesktopOnboardingScreen();

// 在持久化对应的 useEffect 中:
useEffect(() => {
  if (isLoading || completingRef.current) return;
  setDesktopOnboardingScreen(currentScreen);
}, [currentScreen, isLoading]);
  1. 替代解决方案(临时):可以考虑在完成授权后,立即手动清除远程服务器配置(通过应用 IPC),然后重新授权。但此方法在正常重启后仍会复现循环。

验证方法

完成上述步骤后,重启 LobeHub Desktop,确认应用直接加载到主页(/)而不被重定向到 /desktop-onboarding?screen=login。同时检查 localStorage 中 lobechat:desktop:onboarding:screen:v1 的值为空或为其他合理的页面标识(而非 "login")。

参考来源

lobehub/lobe-chat #15859

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 8287

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注