Files
gitlab-instance-0a899031_no…/docs/CROSS_SITE_AUTH.md
2026-03-12 04:25:12 -05:00

51 lines
2.1 KiB
Markdown
Raw Permalink 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.
# 跨站登录态同步说明
## 原理
VIP 站点在用户注册/登录时,通过 `/api/auth/sync-session` 设置 Cookie `pb_session`,域名为 `.hackrobot.cn`
**浏览器会自动将该 Cookie 发送到所有 `*.hackrobot.cn` 子域**(如 digital.hackrobot.cn、meetup.hackrobot.cn**无需从 VIP 跳转**。
## 当前流程
1. 用户在 vip.hackrobot.cn 点击「立即加入」→ 注册/登录
2. AuthForm 调用 `sync-session`,服务端设置 `pb_session`domain=.hackrobot.cn
3. 用户访问 digital.hackrobot.cn 或 meetup.hackrobot.cn 时,浏览器会自动带上该 Cookie
## digital / meetup 需具备的能力
要让 digital、meetup 显示已登录,它们需要:
1. **提供 `/api/auth/me` 接口**:读取请求中的 `pb_session` Cookie校验 token 并返回用户信息
2. **前端调用该接口**:页面加载时请求 `/api/auth/me`,根据返回结果展示登录态
### 接口规范(与 nomadvip 保持一致)
- **Cookie 名**`pb_session`
- **Cookie 域**`.hackrobot.cn`(环境变量 `AUTH_COOKIE_DOMAIN`
- **内容**base64url 编码的 `{ token, userId, email }`
### /api/auth/me 实现参考
可参考 `nomadvip/app/api/auth/me/route.ts`,逻辑为:
1. 读取 `pb_session` Cookie
2. 解码得到 token
3. 调用 PocketBase `api/users/refresh` 校验 token
4. 返回 `{ user: { id, email } }``{ user: null }`
## 常见问题
### 1. 刷新 digital/meetup 仍显示未登录
- 检查 digital/meetup 是否实现了 `/api/auth/me` 并读取 `pb_session`
- 检查是否在同一根域下(如均为 `*.hackrobot.cn`
- 检查 `AUTH_COOKIE_DOMAIN` 是否配置为 `.hackrobot.cn`
### 2. 是否必须从 VIP 跳转过去?
**不需要**。Cookie 由浏览器按域名自动管理,只要 Cookie 已设置,访问任意 `*.hackrobot.cn` 时都会自动带上。
### 3. 不同根域(如 digital.com能否共享
不能。Cookie 的 `domain` 只能作用于当前域及其子域,无法跨根域共享。若 digital、meetup 与 VIP 不在同一根域,需改用 OAuth、JWT 等跨域方案。