前端登录态不持久的根源是前后端状态恢复逻辑未对齐:Token 存储与读取 key 及位置不一致、状态初始化时机错误、请求头未携带 Token、后端缺乏 Token 续期机制,以及 CLI 与浏览器 Token 未同步。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当 Codex CLI 登录后,前端页面能访问用户数据,但刷新就跳回登录页;后端接口返回 Token 正常,浏览器也存了,可状态就是不持久——这不是 Token 没写进去,而是前后端对登录态的恢复逻辑没对齐。
确认 Token 存储与读取路径是否匹配
打开浏览器开发者工具 → Application → Storage → LocalStorage 或 SessionStorage,查找 key 名如 【auth_token】、【user_session】 或项目自定义名(常见有 token、accessToken、codex_auth)。记下这个 key 名。
在前端代码中全局搜索该 key 名,定位到 Token 写入位置(通常在 login 接口响应后)和读取位置(通常在路由守卫或 App 初始化时)。确保写入和读取用的是同一个 key,且存储位置一致(LocalStorage 和 SessionStorage 不互通)。
如果写入用的是 localStorage.setItem('token', res.data.token),但读取时写成 sessionStorage.getItem('token'),那刷新后必然丢失。这是最常被忽略的硬编码不一致问题。
检查前端状态初始化时机
第一步:在 main.js 或 App.vue 的 onMounted / created 钩子中,确认是否调用了 restoreAuthState() 类似函数。
第二步:打开 network 面板,刷新页面,观察是否有 /api/user/profile 或 /api/auth/me 这类用户信息接口被触发。如果没有,说明状态恢复逻辑压根没执行。
第三步:如果该接口发出了但失败了(401),检查请求头是否携带了 Authorization: Bearer {token}。很多项目写了读取逻辑,却忘了把 token 注入 axios 默认 headers。
这一步操作起来很简单,直接在 axios.create() 后加一行 request interceptor 就行,但漏掉就会导致整个状态链断裂。
验证后端 Token 校验是否支持无感续期
方法一:用 curl 直接测试
通过 Codex CLI 生成图片,支持尺寸控制和批量模式。依赖:codex (npm)。代理默认启用。用 generate.sh 生成单张,batch_generate.sh 批量生成游戏 UI 素材,gen_size.sh 指定尺寸。所有输出保存至 ~/.codex/generated_images/。
curl -H "Authorization: Bearer YOUR_TOKEN_HERE" http://localhost:3000/api/auth/validate
看返回是否为 { valid: true, expires_in: 3600 }。如果返回 401 或提示 expired,说明后端校验逻辑未启用 refresh 机制,Token 过期即失效,前端无法靠本地存储维持长期登录。
方法二:检查后端 auth middleware 是否做了双校验
必须同时检查:1)Token 签名与结构有效性;2)是否在 Redis 或数据库中查了该 token 的 active 状态。只做第一项会导致伪造 token 也能过,只做第二项则无法识别过期时间。
【关键前提:后端必须返回 refresh_token 或提供 /auth/refresh 接口】 前端仅靠存储 access_token 无法实现真正持久化,必须配合服务端的续期能力。
强制同步 Codex CLI 与浏览器登录态
第一步:在 Codex CLI 中执行 codex login,完成官方账号登录,此时 ~/.codex/auth.json 已写入有效 session。
第二步:从 auth.json 中提取 "access_token" 字段值(注意不是 api_key),复制该字符串。
第三步:在浏览器控制台执行 localStorage.setItem('codex_auth_token', 'PASTE_TOKEN_HERE'),然后手动刷新页面。
第四步:若此时前端仍无法获取用户信息,说明前端代码未将 localStorage 中的 codex_auth_token 作为默认凭证源——需修改前端 auth service,使其 fallback 到该 key。







