Files
Genarrative/.hermes/skills/genarrative-admin-backoffice/references/daily-login-auth-closure.md

56 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 真实登录成功链路接入每日登录埋点2026-05-08
## 背景
后台“埋点数据”页要能看到真实登录产生的 `daily_login`。此前已完成方案 A把“读取任务中心时顺手写每日登录埋点”拆成独立 SpacetimeDB procedure/client 方法,避免后台查看或刷新任务中心污染登录数据。
闭环时不要再把写入点放回任务中心读取流程;应在认证成功且会话签发后显式调用每日登录埋点入口。
## 推荐接入点
`api-server` 认证成功路径中,先创建/签发会话,再非阻断记录埋点,再同步认证快照并返回:
1. `create_auth_session` / `create_password_auth_session` 成功。
2. 调用统一 helper`record_daily_login_tracking_event_after_auth_success(...)`
3. helper 调用 `state.spacetime_client().record_daily_login_tracking_event(user_id.to_string()).await`
4. 成功写 `info`,失败写 `warn`,不能把埋点失败返回给用户。
已验证的真实登录链路包括:
- 手机验证码登录:`server-rs/crates/api-server/src/phone_auth.rs``phone_login`
- 密码登录入口:`server-rs/crates/api-server/src/password_entry.rs``password_entry`
- 重置密码后自动登录:`server-rs/crates/api-server/src/password_management.rs``reset_password`
- 微信 OAuth 回调登录:`server-rs/crates/api-server/src/wechat_auth.rs``handle_wechat_callback`
- 微信绑定手机号后自动登录:`server-rs/crates/api-server/src/wechat_auth.rs``bind_wechat_phone`
- refresh cookie 续期:`server-rs/crates/api-server/src/refresh_session.rs``refresh_session`。在 `rotate_session` 成功并签发新 access token 后记录,`login_method` 应使用 `rotated.session.issued_by_provider.clone()`,不要固定写成 Password。
## 关键实现约束
- 埋点是运营数据必须保持非阻断SpacetimeDB 调用失败只记录日志,不影响登录成功返回。
- helper 建议放在 `auth_session.rs`,避免各登录 handler 重复错误处理。
- refresh cookie 续期也被产品视为一次每日登录触发;接入 `refresh_session.rs` 时必须放在 token rotate 和 access token 签发成功之后,且保持非阻断,避免刷新失败或缺 cookie 时误写埋点。
- `handle_wechat_callback` 如果要记录 `request_id/operation`,需要在 handler 参数中补 `Extension<RequestContext>`;确认路由层已注入 RequestContext。
- 单元测试默认不启动 SpacetimeDB。若直接调用真实 `spacetime_client` 会让既有认证测试依赖外部服务;可在 `#[cfg(test)]` 下让 helper no-op仅用编译和现有登录成功测试覆盖调用点不破坏返回。
- 后续如需要严格断言“helper 被调用”,应优先为 Spacetime client 引入可注入 trait/mock而不是让 API 单测连接真实 SpacetimeDB。
## 验证命令
```bash
cd server-rs
cargo fmt -p api-server --check
cargo check -p api-server
cargo check -p spacetime-client
cargo test -p api-server auth_session -- --nocapture
cargo test -p api-server refresh_session_rotates_cookie_and_returns_new_access_token -- --nocapture
cargo test -p api-server password_entry_logs_in_existing_phone_user_and_sets_refresh_cookie -- --nocapture
cargo test -p api-server phone_login_creates_user_and_sets_refresh_cookie -- --nocapture
cd ..
npm run check:encoding
git diff --check
```
## 提交注意
- 不要提交 `.env.local``.env.secrets.local` 或任何 token/密码/连接串。
- 若工作区里有本地敏感文件,只提交明确改动的 Rust 文件和 `docs/technical/*` 文档。