Files
Thesisly/docs/auth-integration.md
T

39 lines
3.8 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.
# Foundry 身份接入
复用 `/Users/zzyang/endoleap` 中已实现的 PKCE 和服务端会话模式。后端来源核对:Foundry Core 当前平台/认证源码、`internal/auth/auth.go`、`email.go`、`slack.go` 与 README 的 Browser session lifetime。
## 注册前端项目
英文品牌为 Thesisly;当前本地目录为 `/Users/zzyang/thesisly`,建议后端项目 ID 使用 `thesisly`。后端 Gitea Variables 中的 `FOUNDRY_PROJECTS` 应保留现有 JSON 条目,追加新项目:
```json
{"thesisly":"http://localhost:17322/auth/callback"}
```
这只是新增项示例,**不要用此单项覆盖全部现有项目**。前端 `.env.local` 的 `FOUNDRY_PROJECT` 必须与键完全相同,`APP_ORIGIN=http://localhost:17322`。第三方平台 Google/Slack 回调依然指向共享 Foundry 后端,不改为前端地址。后端变量的应用方式由后端维护方处理;本前端不配置CI/CD。
## 流程
1. OAuth生成随机verifier和SHA256 challenge,verifier仅存当前标签的sessionStorage;顶部导航至同源 `/api/oauth/google|slack` 再跳转Core。
2. `/auth/callback`读取 fragment 中的一次性code/error或verify_email,立即清理地址栏,再向同源代理兑换。StrictMode重复effect复用同一兑换promise,避免重复消费一次性码。
3. 代理把access_token存入本站独立名的HttpOnly、SameSite=Lax Cookie,不返回客户端;不用localStorage保存token。
4. 通过auth/me恢复刷新后的登录状态;authenticated响应的`X-Foundry-Session-Expires-In`驱动Cookie续期,最多30天,绝对90天限制由Core执行。401清Cookie,暂时502保留现有Cookie并显示重试,不假装登录已失效。
5. 退出先撤销Core会话;成功后清Cookie,失败保留会话并告知重试。
6. 代理按路径/方法白名单,限制16KiB请求体;mutation必须与配置的APP_ORIGIN严格同源,跨站请求拒绝。生产HTTPS通过APP_ORIGIN启用Secure。
## 待真实验收
后端注册项目后,需用实际账户验证Google、Slack、首次授权、邮箱注册/验证、刷新恢复、跨标签/失效状态和退出。HTTP 302、单测或模拟token测试不等于真实OAuth授权成功。测试不要求用户把密码或OAuth token发给代理。
## 代理验收
App Router 的 route.ts 直接调用 src/lib/auth-gateway.mjs。tests/auth-gateway.test.mjs 在不编译/启动Next.js的情况下,用标准Request/Response执行同一代理:验证兑换只转发允许的请求头、token只存HttpOnly Cookie、登录成功必须有有效期限、邮件注册不要求立即签发会话、短期续期、撤销后清Cookie、异常时保留Cookie、401清理、请求体限制、同源校验和429重试时间。异常响应中的access_token/refresh_token同样从浏览器响应剥离。退出时若Core已判定会话失效,客户端直接清理已结束的登录状态。
## 2026-11-07 配置更新
用户已确认新增 Thesisly 的 FOUNDRY_PROJECTS 回调。FOUNDRY_RESEARCH_DATABASE 为已撤回的 SQLite 路径方案,无需添加。论文数据正在独立任务迁移到 PostgreSQL;本任务等待迁移后的数据库/schema与只读接入方式,再完成 Core 论文 API。
## 浏览器会话回归
`pnpm test:session` 使用系统 Chrome 和独立端口17323/17324:复制应用源文件到可清理的临时目录,运行真实 Next dev、App Router 代理与浏览器,只有 Core 响应为合成服务。它不会读取项目 .env、占用17322预览、发送真实密码或连接真实 OAuth。7项测试验证HttpOnly/SameSite Cookie及客户端无token、刷新/新标签恢复、跨标签退出、暂时故障后重试、失效清理、退出失败保留会话,以及Google/Slack模拟PKCE和邮箱验证的一次性消费。它证明前端会话接线,不证明真实Core数据、邮件投递、提供方授权或生产配置。