Files
Thesisly/docs/auth-integration.md
T

3.8 KiB
Raw Blame History

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 条目,追加新项目:

{"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数据、邮件投递、提供方授权或生产配置。