Files
Genarrative/.hermes/skills/genarrative-auth-session-flow/references/session-restore-daily-login-tracking-2026-05-08.md
历冰郁-hermes版 7e35231dfe
Some checks failed
CI / verify (pull_request) Has been cancelled
docs: sync genarrative shared skills
2026-05-08 17:39:49 +08:00

2.4 KiB
Raw Blame History

Session restore 每日登录埋点案例2026-05-08

现象

用户反馈:已经登录且 cookie 没过期时,打开网页没有触发每日登录埋点。

根因

当本地 access token 仍有效时,前端 AuthGate 恢复登录态只会复用现有 token 并请求 /api/auth/me/api/auth/me 只读取当前用户,不会进入 POST /api/auth/session/refresh,因此后端 refresh handler 中的每日登录埋点不会执行。

关键误判点:后端已经在 refresh cookie 续期写埋点,不等于“打开网页”一定会触发。前端必须实际调用 refresh/session 接口。

修复模式

  1. src/services/apiClient.ts 暴露强制 refresh 方法,例如:
export async function refreshStoredAccessToken() {
  return refreshAccessToken();
}
  1. src/components/auth/AuthGate.tsx 的 hydrate/restore 中,使用:
await refreshStoredAccessToken();
const nextSession = await getCurrentAuthUser();

而不是只调用:

await ensureStoredAccessToken();
const nextSession = await getCurrentAuthUser();
  1. 保留 ensureStoredAccessToken() 给普通受保护请求兜底;不要把所有请求都改成强制 refresh。

  2. 确认 server-rs/crates/api-server/src/refresh_session.rs 在 rotate refresh session 成功且新 access token 签发成功后调用每日登录埋点 helper。

  3. 确认 server-rs/crates/spacetime-module/src/runtime/profile.rsget_profile_task_center 不再顺手写 daily_login,避免任务中心读取污染登录埋点。

测试

前端测试重点:

  • AuthGate 会等待 refreshStoredAccessToken() 完成后才暴露已恢复用户内容。
  • AUTH_STATE_EVENT 触发 hydrate 时仍保持已挂载平台内容和本地 tab 状态。

命令:

npm run test -- AuthGate.test.tsx
npm run typecheck

后端/SpacetimeDB 编译:

cd server-rs && cargo check -p spacetime-module
cd server-rs && cargo check -p api-server

全局检查:

npm run check:encoding
git diff --check

注意

  • Vitest 0.34 不支持 Jest 的 --runInBand 参数;命令里不要加。
  • 埋点失败只能 warning不能阻断登录态恢复。
  • 如果后续发现打开页面产生过多 refresh 请求,需要在产品口径和埋点口径之间重新设计节流;但不能退回“只读 /api/auth/me 却期待写登录埋点”的状态。